首页 > 解决方案 > 根据行值有条件地创建新列

问题描述

提前感谢您的任何帮助。

我有一个数据框:

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解决方案,但我当然对任何事情都持开放态度。

谢谢!

标签: rdplyrconditional-statementstidyverse

解决方案


在基础 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          

推荐阅读