创建值= dataframe colnames的条件变量

时间:2014-06-26 14:12:36

标签: r conditional

我有一个数据集(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

我将不胜感激任何帮助! 谢谢!!

3 个答案:

答案 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")])