结果不一致

时间:2019-04-03 17:49:07

标签: r apply

这基本上是here提出的问题(不是我所提出的),但是我已经简化了示例,并且我根本无法弄清楚发生了什么,因此我决定将其再次摆在一种可能获得更多响应的方法。

获取数据dd

dd <- structure(list(first = c("118751", "55627", NA), one = c(41006L, 
119098L, 109437L), two = c(118751L, 109016L, 109831L), three = c(122631L, 
104639L, 120634L), four = c(38017L, 118950L, 105440L), five = c(114826L, 
122047L, 124347L), six = c(109438L, 55627L, 118679L), seven = c(27094L, 
107044L, 122161L), eight = c(112473L, 116909L, 124363L), nine = c(120586L, 
114711L, 120509L)), row.names = c(NA, 3L), class = "data.frame")

dd
   first    one    two  three   four   five    six  seven  eight   nine
1 118751  41006 118751 122631  38017 114826 109438  27094 112473 120586
2  55627 119098 109016 104639 118950 122047  55627 107044 116909 114711
3   <NA> 109437 109831 120634 105440 124347 118679 122161 124363 120509

现在,我们要使用first查找行,其中six列中的数字等于apply列中的数字(这是数据帧中的第七列): / p>

apply(dd,1,function(x) as.integer(x["first"])==x[7])

    1     2     3 
FALSE FALSE    NA 

这个结果显然是错误的-2应该产生一个TRUE。奇怪的是,如果我只在第二行上运行相同的操作,我将得到正确的答案:

apply(dd[2,],1,function(x) as.integer(x["first"])==x[7])

   2 
TRUE 

我还尝试了其他子集-1:2、2:3甚至c(1,3)。后者给了我预期的结果,而前两个继续对第2行坚持FALSE。

如果我放下apply,我将得到正确的响应(无论子集如何):

as.integer(dd$first)==dd$six
[1] FALSE  TRUE    NA

到底是怎么回事?

2 个答案:

答案 0 :(得分:2)

问题在于您的数据类型。您的第一列是list1 = [1,2,3] list2 = ['a','b','c'] for i in range(len(list1)): print(str(list1[i])+list2[i]) ,其余列是整数。您尝试使用character中的as.integer()对此进行更正,但是为时已晚。 apply适用于矩阵,而不适用于数据帧。当您给它一个数据帧时,它将立即转换为矩阵。矩阵不能具有不同的列类,并且(通常)apply无法转换为character,因此所有数据都将转换为numeric

这是进行转换的窗口:

character

不幸的是,您可以看到还添加了空格,这使得等式不成立。

相反,请先将您的列转换为正确的类型。或者,更好的是,根本不用理会apply(dd, 1, print) # 1 2 3 # first "118751" "55627" NA # one " 41006" "119098" "109437" # two "118751" "109016" "109831" # three "122631" "104639" "120634" # four " 38017" "118950" "105440" # five "114826" "122047" "124347" # six "109438" " 55627" "118679" # seven " 27094" "107044" "122161" # eight "112473" "116909" "124363" # nine "120586" "114711" "120509"

apply

答案 1 :(得分:1)

x[7]中包装as.integer()可解决您的问题

apply(dd,1,function(x) as.integer(x["first"])==as.integer(x[7]))

因为运行以下代码,您可以看到as.integer(x["first"])x[7]返回的是不可比较的不同class类型。

apply(dd,1,function(x) return(list(class(as.integer(x["first"])), class(x[7]))))

$`1`
$`1`[[1]]
[1] "integer"

$`1`[[2]]
[1] "character"


$`2`
$`2`[[1]]
[1] "integer"

$`2`[[2]]
[1] "character"


$`3`
$`3`[[1]]
[1] "integer"

$`3`[[2]]
[1] "character"