我有一个数据集(df
),
ID A B C D E F
1 0 0 1 1 1 1
2 0 0 0 0 0 0
3 0 1 0 0 0 0
我正在尝试编写一个函数,它将为我提供值为1的所有列的名称,使我的数据集看起来像这样,我不知道从哪里开始。
ID A B C D E F NewCol
1 0 0 1 1 1 1 C,D,E,F
2 0 0 0 0 0 0 NA
3 0 1 0 0 0 0 B
我将不胜感激任何帮助! 谢谢!!
答案 0 :(得分:2)
使用apply
执行逐行操作。 as.logical
将0转换为FALSE
,将1转换为TRUE
。然后对列名使用逻辑索引。
apply(df, 1, function(x) paste(names(df)[as.logical(x)], collapse=", "))
paste
用于将所有列名收集到一个字符对象中。
答案 1 :(得分:1)
这是一种方法
Newdf <- transform(df,
NewCol=sapply(apply(df[, -1], 1, function(x)
colnames(df[,-1])[x==1]),
paste0, collapse=","))
levels(Newdf$NewCol)[levels(Newdf$NewCol)==""] <- "NA"
Newdf
# ID A B C D E F NewCol
# 1 1 0 0 1 1 1 1 C,D,E,F
# 2 2 0 0 0 0 0 0 NA
# 3 3 0 1 0 0 0 0 B
答案 2 :(得分:0)
这是另一种选择,使用&#34; reshape2&#34;:
library(reshape2)
## `melt` your data
dfL <- melt(df, id.vars="ID")
## Use `dcast` to paste the "variable" values together
temp <- dcast(dfL, ID ~ value, value.var="variable",
fun.aggregate=paste, collapse = ",",
fill = NA_character_)
此时的输出如下:
temp
# ID 0 1
# 1 1 A,B C,D,E,F
# 2 2 A,B,C,D,E,F <NA>
# 3 3 A,C,D,E,F B
原始数据集可以是merge
d:
merge(df, temp)
merge(df, temp[c("ID", "TRUE")])