这基本上是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
到底是怎么回事?
答案 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"