对于数据框中的每一行,返回具有非零列名的变量

时间:2014-04-01 18:00:27

标签: r

我正在尝试创建一个变量,其中包含每行不为零的所有列名称的列表。

数据示例:

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

也许我正在尝试将一个矢量放入一个单元格,这就是为什么它不起作用,但我不知道如何获取这些信息然后将其变成一个字符串。我也不明白为什么选择性列上的最大值不起作用。

1 个答案:

答案 0 :(得分:3)

这个怎么样

DF$nonzeros <- simplify2array(
                      apply(
                        DF[1:4], 1, 
                        function(x) paste(names(DF[1:4])[x != 0], collapse = " ")
                      )
                )