提取列标题

时间:2013-10-19 00:19:27

标签: r statistics

我有以下数据框(数据),我想从中提取并打印列标题,其中有一个非零元素:

  M1 M2 M3 M4
2  0  1  0 1
5  1 -1  0 0
7  0  1  1 0

必需的输出:

2: M2 M4
5: M1 M2
7: M2 M3 

到目前为止,我的R代码无效:

colnames(data)[which(data[2] !=0),]

帮助将不胜感激。感谢

3 个答案:

答案 0 :(得分:5)

这将始终返回一个列表:

Map(`[`, list(names(df)), split(col(df)[df != 0],
                                row(df)[df != 0]))

# [[1]]
# [1] "M2" "M4"
# 
# [[2]]
# [1] "M1" "M2"
# 
# [[3]]
# [1] "M2" "M3"

(如果您希望列表共享setNames(..., rownames(df))的行名,您可以在df内包装。)

答案 1 :(得分:4)

让我们看一下不规则结果的更一般情况:

dat <- structure(list(M1 = c(0L, 1L, 0L), M2 = c(1L, -1L, 1L), M3 = -1:1, 
M4 = c(1L, 0L, 0L)), .Names = c("M1", "M2", "M3", "M4"), 
  class = "data.frame", row.names = c("2", "5", "7"))

> dat
  M1 M2 M3 M4
2  0  1 -1  1
5  1 -1  0  0
7  0  1  1  0

内部应用“循环”构造一组逻辑向量。因为R是面向列的,所以第二级处理是在列上完成的。外部应用“循环”从字母名称中提取适当的项目:

 apply( apply(dat,1, as.logical) , 2, function(ll) colnames(dat)[ll] ) 
$`2`
[1] "M2" "M3" "M4"

$`5`
[1] "M1" "M2"

$`7`
[1] "M2" "M3"

您还可以提取其中的数组指示器版本(),然后处理结果:

 > which(dat != 0, arr.ind=TRUE)
  row col
5   2   1
2   1   2
5   2   2
7   3   2
2   1   3
7   3   3
2   1   4

答案 2 :(得分:1)

我在第一行添加1来处理不规则的情况

mm <- read.table(text='M1 M2 M3 M4
2  0  1  1 1
5  1 -1  0 0
7  0  1  1 0',header=TRUE)


res <- apply(mm != 0,1,function(x)colnames(mm)[x])

$`2`
[1] "M2" "M3" "M4"

$`5`
[1] "M1" "M2"

$`7`
[1] "M2" "M3"

编辑保持一致并返回一个列表:

res <- apply(mm != 0,1,function(x)colnames(mm)[x])     
if (!is.null(dim(res)) split(res,seq_along(res[,1]))