我有一个12500 obs的data.frame。 8个变量,其中一个是State(tax $ State)。我希望将数据子集化为我从Shiny中的用户输入获得的多个状态,但是当我添加多个状态时,我不断获取数据。我已经找到了时髦的子集函数。只有两个状态我没有得到警告,但是第三个抛出异常。在每种情况下,我限制在250个障碍物。在返回。例如
temp<-subset(taxes, State==c("AL","MO",TX))
警告信息:1:在is.na(e1)|中is.na(e2):
较长的物体长度不是较短物体长度的倍数
2:在==.default
(州,c(&#34; AL&#34;,&#34; MO&#34;,&#34; TX&#34;)):
较长的物体长度不是较短物体长度的倍数
我已尝试使用相同结果的其他变量
temp<-subset(taxes,StateFullName==c("Iowa","Missouri","Texas"))
警告讯息: 在StateFullName == c(&#34; Iowa&#34;,&#34; Missouri&#34;,&#34; Texas&#34;): 较长的物体长度不是较短物体长度的倍数
关于为什么我限制在250只障碍物的任何想法?
答案 0 :(得分:3)
您只需要%in%
来比较vector
的{{1}}&gt; 1即。
length
或者使用subset(taxes, State %in% c('AL', 'MO', 'TX'))
# State amount
#4 MO 14143
#27 TX 11517
#30 AL 14465
,我们会转换&#39; data.frame&#39;到&#39; data.table&#39; (data.table
),将setDT(taxes
列设置为&#39;州&#39;并提取具有&#39; MO&#39;,&#39; TX&#39;&#39; AL&#39;在&#39;州&#39;。
key
要了解您的代码无效的原因,请检查逻辑向量输出。
library(data.table)
setDT(taxes, key='State')[c('MO', 'TX', 'AL')]
# State amount
#1: MO 14143
#2: TX 11517
#3: AL 14465
警告信息:1:在is.na(e1)|中is.na(e2):较长的物体长度 不是较短对象长度的倍数
此示例中没有任何元素为with(taxes, State==c('AL', 'MO', 'TX'))
# [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [49] FALSE FALSE
。它的比较方式是基于回收。 “状态”的前三个元素是&#39;与向量&#39; AL&#39;,&#39; MO&#39;和&#39; TX&#39;进行比较。按顺序
TRUE
在这里,我们比较两个向量的相应值之间的元素和
taxes$State[1:3] == c('AL', 'MO', 'TX')
#[1] FALSE FALSE FALSE
与&#39; AL&#39;,&#39; MO&#39;和&#39; TX&#39;不匹配在相应的位置,它返回&#39; FALSE&#39;。
同样地,它与 taxes$State[1:3]
#[1] AK AL AR
的状态&#39;进行比较。列,即下一个比较是
length
此处所有 taxes$State[4:6] == c('AL', 'MO', 'TX')
#[1] FALSE FALSE FALSE
都是相应的“状态”。元素包括&#39; AZ&#39; CA&#39;&#39; CO&#39;。我们最后会收到警告,因为
FALSE
nrow(taxes)
#[1] 50
如果数据集的50%%3!=0
为nrow
,则警告不会出现,但仍然根据位置进行比较,我们可能无法按预期结果。
51
答案 1 :(得分:0)
是的。所以我不知道或理解的是因为我从未使用过子集的向量是该子集将c(a,b,c)看作序列而不是单个匹配的列表。谢谢大家的帮助!