R 合并多个真/假列,同时将其余列保留在数据帧中
我有一个dataframe,我想将3个TRUE/FALSE列合并到一个列中,同时保留原始dataframe列的其余部分 下面是一个数据示例,但实际数据有更多列: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
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