我有三个列表,其中Inf为数字,“NaN”为字符变量。
v1<-list(1,Inf,3,4,5,6,"NaN")
v2<-list(1,"NaN",3,4,5,6,5)
v3<-list(1,2,3,4,5,6,"NaN")
目前我可以使用cbind创建一个矩阵,但所需的结果是代码B)。
A)我得到了什么:
matrix<-cbind(v1,v2,v3)
v1 v2 v3
[1,] 1 1 1
[2,] Inf "NaN" 2
[3,] 3 3 3
[4,] 4 4 4
[5,] 5 Inf 5
[6,] 6 6 6
[7,]"NaN" 7 "NaN"
B)我想得到:
v1 v2 v3
[1,] 1 1 1
[2,] 3 3 3
[3,] 4 4 4
[4,] 6 6 6
上下文: 我想导出一个.txt文件,一些结果位于3个列表中,对我来说很容易就是使用cbind获取矩阵并使用
write.table(matrix, file="mymatrix.txt", row.names=FALSE, col.names=FALSE)
答案 0 :(得分:2)
关于这个问题的一些建议。
1)最好不要将matrix
对象命名为matrix
。
2)NaN
或NA
具有特殊含义且不是字符串。通过使用引号"NaN"
,很难应用自定义函数is.nan/is.na
来执行任何操作。所以,我们必须诉诸==/!=
3)不清楚为什么个人list
被cbind
加入matrix
。
根据输入数据,我们可以使用apply
循环遍历'matrix'列,然后循环遍历每个list
元素,检查我们是否有一个有限元素而不是“NaN”,得到rowSums
,否定(!
- 将0个元素转换为TRUE,即行中的所有元素都是有限的,所有其他值都为FALSE)。使用逻辑索引对行进行子集化。
matrix[!rowSums(apply(matrix, 2, FUN = function(x)
sapply(x, function(y) !(is.finite(y) & y !="NaN")))),]
# v1 v2 v3
#[1,] 1 1 1
#[2,] 3 3 3
#[3,] 4 4 4
#[4,] 6 6 6