R 合并多个真/假列,同时将其余列保留在数据帧中

R 合并多个真/假列,同时将其余列保留在数据帧中,r,dataframe,merge,R,Dataframe,Merge,我有一个dataframe,我想将3个TRUE/FALSE列合并到一个列中,同时保留原始dataframe列的其余部分 下面是一个数据示例,但实际数据有更多列: table <- "year type red blue yellow 1 2019 A TRUE FALSE FALSE 2 2019 A FALSE TRUE FALSE 3 2019 B FALSE TRUE FALSE 4 2019 B TRUE FALSE FALSE 5 20

我有一个dataframe,我想将3个TRUE/FALSE列合并到一个列中,同时保留原始dataframe列的其余部分

下面是一个数据示例,但实际数据有更多列:

table <- "year type red blue yellow
1  2019    A TRUE FALSE FALSE
2  2019    A FALSE TRUE FALSE
3  2019    B FALSE TRUE FALSE
4  2019    B TRUE FALSE FALSE
5  2020    C FALSE FALSE TRUE 
6  2020    C FALSE FALSE TRUE
7  2020    D FALSE TRUE FALSE
8  2021    D TRUE FALSE FALSE
9  2021    D TRUE FALSE FALSE
10 2021    D FALSE TRUE FALSE"

df <- read.table(text=table, header = TRUE)
df
我希望合并颜色列,使其如下所示:

table <- "year type color
1  2019    A red
2  2019    A blue
3  2019    B blue
4  2019    B red
5  2020    C yellow 
6  2020    C yellow
7  2020    D blue
8  2021    D red
9  2021    D red
10 2021    D blue"
我尝试使用melt from,但除了合并的列之外,只保留了一个指定的列,并删除了其余的列


非常感谢您的帮助。

这里是一个基本的解决方案

table <- "year type red blue yellow
1  2019    A TRUE FALSE FALSE
2  2019    A FALSE TRUE FALSE
3  2019    B FALSE TRUE FALSE
4  2019    B TRUE FALSE FALSE
5  2020    C FALSE FALSE TRUE 
6  2020    C FALSE FALSE TRUE
7  2020    D FALSE TRUE FALSE
8  2021    D TRUE FALSE FALSE
9  2021    D TRUE FALSE FALSE
10 2021    D FALSE TRUE FALSE"

df <- read.table(text=table, header = TRUE)
df

df2 <- cbind(df[1:2],  colnames(df)[apply(df[,3:5], 1, function(x) which(x)) + 2])
colnames(df2)[3] <- 'color'
df2

   year type  color
1  2019    A    red
2  2019    A   blue
3  2019    B   blue
4  2019    B    red
5  2020    C yellow
6  2020    C yellow
7  2020    D   blue
8  2021    D    red
9  2021    D    red
10 2021    D   blue
df2 <- df[1:2]
df2$color <- apply(df[3:5], 1, function(k) names(df[3:5])[k])
df2
#   year type  color
#1  2019    A    red
#2  2019    A   blue
#3  2019    B   blue
#4  2019    B    red
#5  2020    C yellow
#6  2020    C yellow
#7  2020    D   blue
#8  2021    D    red
#9  2021    D    red
#10 2021    D   blue

我们可以使用矢量化的max.col


另一个基本R选项使用`哪个+顺序`

给予


谢谢你,这个方法很简单而且很有效!
cbind(df[1:2], color = names(df)[-(1:2)][max.col(df[-(1:2)], 'first')])
with(
  data.frame(which(df[-(1:2)] == "TRUE", arr.ind = TRUE)),
  cbind(df[1:2], color = names(df)[-(1:2)][col[order(row)]])
)
   year type  color
1  2019    A    red
2  2019    A   blue
3  2019    B   blue
4  2019    B    red
5  2020    C yellow
6  2020    C yellow
7  2020    D   blue
8  2021    D    red
9  2021    D    red
10 2021    D   blue