我有一个矩阵,data.mat,它看起来像:
A B C D E
45 43 45 65 23
12 45 56 NA NA
13 4 34 12 NA
我正在尝试将其转换为列表列表,其中每一行都是一个更大列表中的一个列表。我执行以下操作:
list <- tapply(data.mat,rep(1:nrow(data.mat),ncol(data.mat)),function(i)i)
这给了我一个列表列表,其中包含NAs,例如:
$`1`
[1] 45 43 45 65 23
$`2`
[1] 12 45 56 NA NA
$`3`
[1] 13 4 34 12 NA
但我想要的是:
$`1`
[1] 45 43 45 65 23
$`2`
[1] 12 45 56
$`3`
[1] 13 4 34 12
有没有一种好的方法可以在tapply调用期间或之后删除NAs?
发布于 2014-09-11 00:39:31
当然,您可以像这样使用lapply
:
> lapply(list, function(x) x[!is.na(x)])
$`1`
[1] 45 43 45 65 23
$`2`
[1] 12 45 56
$`3`
[1] 13 4 34 12
发布于 2014-09-11 01:11:59
您的示例数据:
data.mat <- data.matrix(read.table(text = "A B C D E
45 43 45 65 23
12 45 56 NA NA
13 4 34 12 NA ", header = TRUE))
要按行拆分:
row.list <- split(data.mat, row(data.mat))
要删除NAs,请执行以下操作:
Map(Filter, list(Negate(is.na)), row.list)
或
lapply(row.list, Filter, f = Negate(is.na))
一切都在一次拍摄中完成:
Map(Filter, list(Negate(is.na)), split(data.mat, row(data.mat)))
发布于 2014-09-11 00:38:47
你可以这样做:
apply(data.mat, 1, function(x) x[!is.na(x)])
输出:
[[1]]
A B C D E
45 43 45 65 23
[[2]]
A B C
12 45 56
[[3]]
A B C D
13 4 34 12
如果你不想要名字:
apply(data.mat, 1, function(x) unname(x[!is.na(x)]))
如果每一行都有相同数量的NAs,则使用以下命令会更安全:
split(apply(data.mat, 1, function(x) unname(x[!is.na(x)])), 1:nrow(data.mat))
https://stackoverflow.com/questions/25777104
复制相似问题