应用 NaN 删除 columns/rows
Delete columns/rows with NaN with apply
所以,我有以下矩阵 m:
[,1] [,2] [,3] [,4] [,5]
v1 0 1 2 3 3
v2 1 1 NaN 4 4
v3 2 2 2 3 4
v4 NaN 3 3 4 5
v5 4 NaN 4 5 5
并且我需要消除具有 NaN 的列(和行)。
我找到了几种简单的方法,例如:
m[,!is.nan(colSums(m))]
用于列,但我想使用应用。
我试过使用这个 (sol 1):
m[,!is.nan(apply(m,1,sum))]
但它显示了前两列。
我终于想到了这个 (sol 2):
m2[,!as.logical(colSums(-apply(m2, 2, is.nan)))]
但我认为解决方案不是那么优雅。
有没有办法让它更短?
另外,为什么我的第一个解决方案不起作用?
要练习 apply
函数,请记住逗号的位置很重要。
m[,!is.nan(apply(m, 2, sum))]
[,1] [,2]
v1 3 3
v2 4 4
v3 3 4
v4 4 5
v5 5 5
m[!is.nan(apply(m, 1, sum)),]
[,1] [,2] [,3] [,4] [,5]
v1 0 1 2 3 3
v3 2 2 2 3 4
m[!is.na(rowSums(m)),!is.na(colSums(m))]
不需要求和
m <- matrix(c(
0, 1, 2, 3, 3,
1, 1, NaN, 4, 4,
2, 2, 2, 3, 4,
NaN, 3, 3, 4, 5,
4, NaN, 4, 5, 5), 5, byrow=TRUE)
m[!apply(is.na(m),1,any), !apply(is.na(m),2,any)]
或(如果您想要其他结果)用 is.nan()
代替 is.na()
所以,我有以下矩阵 m:
[,1] [,2] [,3] [,4] [,5]
v1 0 1 2 3 3
v2 1 1 NaN 4 4
v3 2 2 2 3 4
v4 NaN 3 3 4 5
v5 4 NaN 4 5 5
并且我需要消除具有 NaN 的列(和行)。 我找到了几种简单的方法,例如:
m[,!is.nan(colSums(m))]
用于列,但我想使用应用。
我试过使用这个 (sol 1):
m[,!is.nan(apply(m,1,sum))]
但它显示了前两列。
我终于想到了这个 (sol 2):
m2[,!as.logical(colSums(-apply(m2, 2, is.nan)))]
但我认为解决方案不是那么优雅。
有没有办法让它更短? 另外,为什么我的第一个解决方案不起作用?
要练习 apply
函数,请记住逗号的位置很重要。
m[,!is.nan(apply(m, 2, sum))]
[,1] [,2]
v1 3 3
v2 4 4
v3 3 4
v4 4 5
v5 5 5
m[!is.nan(apply(m, 1, sum)),]
[,1] [,2] [,3] [,4] [,5]
v1 0 1 2 3 3
v3 2 2 2 3 4
m[!is.na(rowSums(m)),!is.na(colSums(m))]
不需要求和
m <- matrix(c(
0, 1, 2, 3, 3,
1, 1, NaN, 4, 4,
2, 2, 2, 3, 4,
NaN, 3, 3, 4, 5,
4, NaN, 4, 5, 5), 5, byrow=TRUE)
m[!apply(is.na(m),1,any), !apply(is.na(m),2,any)]
或(如果您想要其他结果)用 is.nan()
代替 is.na()