r - 根据行值有条件地创建新列
问题描述
提前感谢您的任何帮助。
我有一个数据框:
df <- structure(list(ID = c("0001", "0002", "0003", "0004"), May_1 = c(1,
2, 1, 3), May_5 = c(NA, 1, 2, 1), May_10 = c(NA, 3, 3, NA), May_16 = c(2,
NA, NA, NA), May_20 = c(3, NA, NA, 2)), row.names = c(NA, -4L
), class = c("tbl_df", "tbl", "data.frame"))
我想根据每个响应的行值创建名为“First Preference”、“Second Preference”和“Third Preference”的新列。
如果行值 == 1,我想附加一个名为“First Preference”的列,其中包含行值 == 1 的列名。
我的实际数据包含大约 40 个日期,这些日期每周都会发生变化,因此非常感谢一个通用的解决方案。
这是理想的df:
df_ideal <- structure(list(ID = c("0001", "0002", "0003", "0004"), May_1 = c(1,
2, 1, 3), May_5 = c(NA, 1, 2, 1), May_10 = c(NA, 3, 3, NA), May_16 = c(2,
NA, NA, NA), May_20 = c(3, NA, NA, 2), First_Preference = c("May_1",
"May_5", "May_1", "May_5"), Second_Preference = c("May_16", "May_1",
"May_5", "May_20"), Third_Preference = c("May_20", "May_10",
"May_10", "May_1")), row.names = c(NA, -4L), class = c("tbl_df",
"tbl", "data.frame"))
最好有一个tidyverse
解决方案,但我当然对任何事情都持开放态度。
谢谢!
解决方案
在基础 R 中,我们可以按apply
行使用order
值删除NA
值并获取相应的列名。
cols <- paste(c('First', 'Second', 'Third'), "Preference", sep = "_")
df[cols] <- t(apply(df[-1], 1, function(x) names(df)[-1][order(x, na.last= NA)]))
df
# A tibble: 4 x 9
# ID May_1 May_5 May_10 May_16 May_20 First_Preference Second_Preference Third_Preference
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <chr> <chr>
#1 0001 1 NA NA 2 3 May_1 May_16 May_20
#2 0002 2 1 3 NA NA May_5 May_1 May_10
#3 0003 1 2 3 NA NA May_1 May_5 May_10
#4 0004 3 1 NA NA 2 May_5 May_20 May_1
推荐阅读
- python - 我无法在 Mac 上安装 PyAudio
- spring - 无法在 web.xml 或随此应用程序部署的 jar 中解析 spring 表单标签 uri
- r - 如何使用以百分比计算的数字创建堆积条形图?
- c++ - 有没有办法从 Visual Studio 调试器进入 COM 接口?
- javascript - 正则表达式 Javascript 在标点符号后添加空格
- reactjs - 如何更改背景颜色
- angular - 当queryParams改变时如何触发can-deactivate-guard?
- mysql - 将外键添加到现有表(错误 1451)
- r - 按订单 ID 汇总数据帧
- python - 将用户输入逐行附加到 CSV 文件