创建值为dataframe colnames的条件变量
我有一个数据集(创建值为dataframe colnames的条件变量,r,conditional,R,Conditional,我有一个数据集(df) 我正在尝试编写一个函数,它将为我提供所有值为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 我将感谢任何帮助! 谢谢 使用apply执行行操作as.l
df
)
我正在尝试编写一个函数,它将为我提供所有值为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
我将感谢任何帮助!
谢谢 使用
apply
执行行操作as.logical
将0转换为FALSE
,将1转换为TRUE
。然后对列名使用逻辑索引
apply(df, 1, function(x) paste(names(df)[as.logical(x)], collapse=", "))
粘贴
用于将所有列名收集到一个字符对象中。以下是一种方法
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
Newdf这里有一个替代方案,使用“重塑2”:
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
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(df, temp)
merge(df, temp[c("ID", "TRUE")])