我有一个12500 obs的data.frame。8个变量中的一个,其中一个是State(taxes $ State)。我想将数据细分为从Shiny中的用户输入获得的多个状态,但是当我添加多个状态时,我一直在删除数据。我已经归结为时髦的子集功能。我只有两种状态没有警告,但是第三种引发异常。在任何情况下,我仅限于250磅。在返回。例如
temp<-subset(taxes, State==c("AL","MO",TX))
警告消息:1:在is.na(e1)中| is.na(e2):较长的对象长度不是较短的对象长度的倍数:In ==.default
(State,c(“ AL”,“ MO”,“ TX”)):较长的对象长度不是较短的对象长度的倍数长度
我也尝试了其他变量也具有相同的结果
temp<-subset(taxes,StateFullName==c("Iowa","Missouri","Texas"))
警告消息:在StateFullName == c(“ Iowa”,“ Missouri”,“ Texas”)中:较长的对象长度不是较短的对象长度的倍数
关于为什么我仅限于250个观察点的任何想法?
您只需要%in%
比较> 1的a vector
,length
即
subset(taxes, State %in% c('AL', 'MO', 'TX'))
# State amount
#4 MO 14143
#27 TX 11517
#30 AL 14465
或使用data.table
,我们将'data.frame'转换为'data.table'(setDT(taxes
),将key
列设置为'State',并提取在'State'中具有'MO','TX','AL'的行。
library(data.table)
setDT(taxes, key='State')[c('MO', 'TX', 'AL')]
# State amount
#1: MO 14143
#2: TX 11517
#3: AL 14465
要了解为什么您的代码无法正常工作,让我们检查一下逻辑向量输出。
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
警告消息:1:在is.na(e1)中| is.na(e2):较长的对象长度不是较短的对象长度的倍数
TRUE
此示例均不包含任何元素。比较的方式基于回收。依次将“状态”的前三个元素与向量“ AL”,“ MO”和“ TX”进行比较
taxes$State[1:3] == c('AL', 'MO', 'TX')
#[1] FALSE FALSE FALSE
在这里,我们将两个向量的对应值之间的逐个元素进行比较,并比较
taxes$State[1:3]
#[1] AK AL AR
在相应位置不匹配“ AL”,“ MO”和“ TX”,则返回“ FALSE”。
以同样的方式,对它进行比较,直到length
“状态”列,即下一个比较是
taxes$State[4:6] == c('AL', 'MO', 'TX')
#[1] FALSE FALSE FALSE
FALSE
由于“状态”元素分别是“ AZ”,“ CA”和“ CO”,因此也都是这里。最后我们收到警告,因为
nrow(taxes)
#[1] 50
50%%3!=0
如果nrow
数据集的是51
,则警告将不会出现,但是由于比较是基于位置的,因此我们可能无法获得预期的结果。
set.seed(24)
taxes <- data.frame(State=sample(state.abb),
amount=sample(400:20000, 50, replace=TRUE), stringsAsFactors=FALSE)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句