我正在尝试创建一个变量,其中包含每行不为零的所有列名称的列表。
数据示例:
set.seed(334)
DF <- matrix(sample(0:9,9),ncol=4,nrow=10)
DF <- as.data.frame.matrix(DF)
DF$id <- c("ty18","se78","first", "gh89", "sil12","seve","aga2", "second","anotherX", "CH560")
DF$count <- rowSums(DF[,2:5]>0)
DF
> V1 V2 V3 V4 id count
> 1 9 4 0 5 ty18 3
> 2 4 0 5 8 se78 3
> 3 0 5 8 2 first 4
> 4 5 8 2 6 gh89 4
> 5 8 2 6 7 sil12 4
> 6 2 6 7 3 seve 4
> 7 6 7 3 9 aga2 4
> 8 7 3 9 4 second 4
> 9 3 9 4 0 anotherX 3
> 10 9 4 0 5 CH560 3
所需的输出将是一个新变量,对于第1行,“V1 V2 V4”和第2行“V1 V3 V4”。我只想使用V1-V4,而不考虑id或count。
关于SO的这个问题有助于:For each row return the column name of the largest value
我尝试对此进行测试,但它忽略了我的选择列,即使是max,所以这里的第一个测试只给出整行的最大值,这在我的数据中并不总是在V1-V4中。
DF$max <- colnames(DF)[apply(DF[,1:4],1,which.max)]
尽管有错误,我想我需要做这样的事情,但我的DF $列表尝试显然都是错的:
DF$list <- colnames(DF[,1:4]>0)
我正在
Error in `$<-.data.frame`(`*tmp*`, "list", value = c("V1", "V2", "V3", :
replacement has 4 rows, data has 10
也许我正在尝试将一个矢量放入一个单元格,这就是为什么它不起作用,但我不知道如何获取这些信息然后将其变成一个字符串。我也不明白为什么选择性列上的最大值不起作用。
答案 0 :(得分:3)
这个怎么样
DF$nonzeros <- simplify2array(
apply(
DF[1:4], 1,
function(x) paste(names(DF[1:4])[x != 0], collapse = " ")
)
)