我有以下数据框(数据),我想从中提取和打印列标题,只要有非零元素:
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),]
帮助将不胜感激。谢谢
我有以下数据框(数据),我想从中提取和打印列标题,只要有非零元素:
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),]
帮助将不胜感激。谢谢
这将始终返回一个列表:
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
的行名,您可以在里面换行。)
让我们以更一般的不规则结果为例:
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 是面向列的,所以第二级处理是在列上完成的。外部应用“循环”从 colnames 中提取适当的项目:
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() 的数组指标版本,然后处理结果:
> 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
我在第一行加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]))