数据框搜索==找不到所有条件

时间:2018-05-07 18:00:14

标签: r dataframe search conditional extract

我试图有条件地替换数据帧中的某些字段;但是,我的代码发现了大约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;。

我希望得到一些帮助,如果我没有按照所需的格式提供某些东西或避风港,请告诉我们!

2 个答案:

答案 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

并且

Difference between `%in%` and `==`