我试图有条件地替换数据帧中的某些字段;但是,我的代码发现了大约25%的实际实例。我已经搜索了其他条件搜索问题,但没有找到与我的问题相符的任何内容 - 如果我错过了一个,我会提前道歉。
具体来说,我试图在dta $ day中用1到9替换所有数字1到9。
以下是该向量中的前100项:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 7 8 9
当我有条件地搜索值1到9时,使用:
dta$day == c("1","2","3","4","5","6","7","8","9")
它指出只有该分组中的第一个和最后一个匹配我的条件如下(我已加粗〜应该为TRUE,以供参考):
[1] **TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE** FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[17] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE **FALSE**
[33] **FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE** FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[49] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE **FALSE FALSE**
[65] **FALSE FALSE FALSE FALSE FALSE FALSE FALSE** FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[81] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE **TRUE TRUE TRUE TRUE TRUE TRUE**
[97] **TRUE TRUE TRUE**
问题必须在第一步,但为了显示结果,在应用此代码后,只有我向量中前100个中的第一个和最后一个集合被适当替换:
dta[dta$day == c("1","2","3","4","5","6","7","8","9"),1
] <- c("a", "b", "c", "d", "e", "f", "g", "h", "i")
[1] **"a" "b" "c" "d" "e" "f" "g" "h" "i"** "10" "11" "12" "13" "14" "15" "16" "17" "18" "19"
[20] "20" "21" "22" "23" "24" "25" "26" "27" "28" "29" "30" "31" **"1" "2" "3" "4" "5" "6" "7"**
[39] "8" "9" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26"
[58] "27" "28" **"1" "2" "3" "4" "5" "6" "7" "8" "9" "10"** "11" "12" "13" "14" "15" "16" "17"
[77] "18" "19" "20" "21" "22" "23" "24" "25" "26" "27" "28" "29" "30" "31" **"a" "b" "c" "d" "e"
[96] "f" "g" "h" "i"**
如果有用,这是该向量的初始状态:
is.numeric(dta$day)
[1] TRUE
summary(dta$day)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 8.00 16.00 15.73 23.00 31.00
我在这里复制数据框:
day <- c(1:31,1:28,1:31,1:30)
month <- c(rep_len(1,31),rep_len(2,28),rep_len(3,31),rep_len(4,30))
temp <- rnorm(length(month),10,10)
dta=as.data.frame(cbind(day,month,temp))
实际上,虽然我能够通过这个玩具示例重现问题,但我得到一个警告,我没有得到我的实际数据(这里没有复制,因为它非常大):&#34;较长的物体长度不是较短物体长度的倍数&#34;。
我希望得到一些帮助,如果我没有按照所需的格式提供某些东西或避风港,请告诉我们!
答案 0 :(得分:4)
看起来你正在检查向量的等价性,而不是它的组件。请尝试使用%in%
,如下所示:
dta[dta$day %in% c("1","2","3","4","5","6","7","8","9"), ]
答案 1 :(得分:0)
使用%in%
而非==
,然后将数据框/向量编入索引,如下所示,将1:9替换为:i,如所需:
y <- c(1:9)
dta$day[dta$day %in% y] <- letters[1:length(y)]
在此处阅读有关这些运营商的不同行为的更多信息:
Difference between the == and %in% operators in R
并且