Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于行值有条件地创建新列_R_Dplyr_Conditional Statements_Tidyverse - Fatal编程技术网

R 基于行值有条件地创建新列

R 基于行值有条件地创建新列,r,dplyr,conditional-statements,tidyverse,R,Dplyr,Conditional Statements,Tidyverse,提前感谢您的帮助 我有一个数据帧: 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 <- 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"))
一个整洁的解决方案将是首选,但我当然愿意接受任何事情


谢谢

我们可以将其重塑为“长”格式,同时删除带有值的NA元素,然后使用“值”列作为索引来更改标签,然后使用pivot\u wide将其转换回“宽”格式

或者使用data.table


我们可以将其重塑为“长”格式,同时删除具有值的NA元素,然后使用“值”列作为索引来更改标签,然后使用pivot\u wider将其转换回“宽”格式

或者使用data.table

在baser中,我们可以使用apply按行顺序对值进行排序,删除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          
在baser中,我们可以使用apply按行顺序对值进行排序,删除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          

谢谢你,这不是你第一次帮我了!我结合了你的第一个和第二个选项,使用了一个修改过的左连接来完成我的完整df,它包含了更多的列。谢谢你,这不是你第一次帮助我了!我将您的第一个和第二个选项与修改后的左连接结合起来,用于包含更多列的完整df。
library(data.table)
setDT(df)[dcast(melt(df, id.var = 'ID', na.rm = TRUE), 
    ID ~ paste0(ordinal(value), "_preference"), value.var = 'variable'), on = .(ID)]
#     ID May_1 May_5 May_10 May_16 May_20 first_preference second_preference third_preference
#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
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