R 子集 returns 有限集,有警告

R subset returns limited set with warning

我有一台 data.frame,观测值 12500。 8 个变量,其中之一是 State (taxes$State)。我想将数据子集化为我从 Shiny 中的用户输入获得的多个状态,但是当我添加多个状态时,我不断地丢失数据。我已经了解了表现时髦的子集函数。我只有两个状态没有收到警告,但第三个状态抛出异常。在每种情况下,我都限制在 250 个 obs。在 return 上。例如

temp<-subset(taxes, State==c("AL","MO",TX))

警告message:1:在is.na(e1) | is.na(e2) : 较长的物体长度不是较短物体长度的倍数 2: 在 ==.default(状态, c("AL", "MO", "TX")) : 较长的对象长度不是较短对象长度的倍数

我尝试了其他变量也得到了相同的结果

temp<-subset(taxes,StateFullName==c("Iowa","Missouri","Texas"))

警告信息: 在 StateFullName == c("Iowa", "Missouri", "Texas") 中: 较长的对象长度不是较短对象长度的倍数

关于为什么我被限制为 250 个 obs 的任何想法?

函数中的逻辑表达式不符合你的要求。它正在寻找等于向量 c("AL","MO","TX") 的观察值。由于 12500 是 2 的倍数,subset 尝试考虑向量中的两个元素进行子集化。由于12500不是3的倍数,当vector有3个元素时不能使用相同的处理,抛出warning。

简而言之,替换逻辑表达式的选项是:

temp <- subset(taxes, State == "AL" | State == "MO" | State == "TX"))

这可以在这个简单的例子中进行测试:

df <- data.frame(x = c("A", "B", "A", "C", "D", "E", "A", "C"))
subset(df, x=="A" | x =="B" | x == "C")

您只需要 %in% 来比较 length > 1 的 vector

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' 并且提取 'MO'、'TX'、'AL' 在 'State'.

中的行
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

Warning messages: 1: In is.na(e1) | is.na(e2) : longer object length is not a multiple of shorter object length

None 个元素在本示例中为 TRUE。它比较的方式是基于回收。 'State' 的前 3 个元素按 'AL'、'MO' 和 'TX' 的顺序与向量

进行比较
 taxes$State[1:3] == c('AL', 'MO', 'TX')
 #[1] FALSE FALSE FALSE

在这里,我们逐个元素比较两个向量的对应值和 as

  taxes$State[1:3]
  #[1] AK AL AR

没有匹配到对应位置的'AL'、'MO'、'TX',returns 'FALSE'.

同理,比较到'State'列的length,即下一个比较是

 taxes$State[4:6] == c('AL', 'MO', 'TX')
 #[1] FALSE FALSE FALSE

这里也都是 FALSE,因为相应的 'State' 元素是 'AZ'、'CA' 和 'CO'。我们在最后收到警告,因为

 nrow(taxes)
 #[1] 50

50%%3!=0

如果数据集的nrow51,警告就不会出现,但仍然是基于位置的比较,我们可能不会得到预期的结果。

数据

set.seed(24)
taxes <- data.frame(State=sample(state.abb), 
       amount=sample(400:20000, 50, replace=TRUE), stringsAsFactors=FALSE)

是的。因此,由于我从未对子集使用向量,所以我不知道或不理解的是,该子集将 c(a,b,c) 视为一个序列,而不是单个匹配项的列表。感谢大家的帮助!