Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建值为dataframe colnames的条件变量_R_Conditional - Fatal编程技术网

创建值为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")])