【发布时间】:2014-07-11 19:43:03
【问题描述】:
我不明白这里发生了什么:
设置:
> df = data.frame(x1= rnorm(10), x2= rnorm(10))
> df[3,1] <- "the"
> df[6,2] <- "NA"
## I want to create values that will be challenging to coerce to numeric
> df$x1.fixed <- as.numeric(df$x1)
> df$x2.fixed <- as.numeric(df$x2)
## Here is the DF
> df
x1 x2 x1.fixed x2.fixed
1 0.955965351551298 -0.320454533088042 0.9559654 -0.3204545
2 -1.87960909714257 1.61618672247496 -1.8796091 1.6161867
3 the -0.855930398468875 NA -0.8559304
4 -0.400879592905882 -0.698655375066432 -0.4008796 -0.6986554
5 0.901252404134257 -1.08020133150191 0.9012524 -1.0802013
6 0.97786920899034 NA 0.9778692 NA
.
.
.
> table(is.na(df[,c(3,4)]))
FALSE TRUE
18 2
我想找到转换为 NAs 的行,所以我输入了一个复杂的应用程序,但没有按预期工作。然后我简化并再次尝试......
问题:
更简单的调用:
> apply(df, 1, function(x) (any(is.na(df[x,3]), is.na(df[x,4]))))
出乎意料地产生了:
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
相反,我希望:
[1] FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
突出显示存在NA 的行(3 和6)。为了验证非apply'ed 函数是否有效,我尝试了:
> any(is.na(df[3,1]), is.na(df[3,2]))
[1] FALSE
> any(is.na(df[3,3]), is.na(df[3,4]))
[1] TRUE
正如预期的那样。为了进一步加深我对 apply 正在做什么的困惑,我尝试了:
> apply(df, 1, function(x) is.na(df[x,1]))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[2,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[3,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[4,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
为什么这会遍历整个 DF,当我已经清楚地表明 (a) 我想要它在行方向上(我将“1”传递给第二个参数),并且 (b) 值“x”是只放行id,不放列id?
我知道还有其他可能更好的方法来做我想做的事情(在新列中找到已更改为 NA 的行。但请不要在答案中提供。相反,请解释为什么apply 没有按我的预期工作,以及我可以做些什么来解决它。
【问题讨论】:
-
您不应该将
df传递给匿名function(x),它已经为您逐行细分了apply(df, 1, function(x) (any(is.na(x[3:4])))) -
嗨 Rawr,这正是我想要的!如果您将其放入答案中,我会竖起大拇指并勾选正确。