我有一个包含 12500 个 obs 的 data.frame。共有 8 个变量,其中之一是 State (taxes$State)。我想将数据子集化为从 Shiny 中的用户输入获得的多个状态,但当我添加多个状态时,我不断收到丢失的数据。我已经开始讨论表现得很奇怪的子集函数。只有两种状态我没有收到警告,但第三种状态抛出异常。在任何情况下,我都限制为 250 个 obs。在返回时。例如
temp<-subset(taxes, State==c("AL","MO",TX))
Run Code Online (Sandbox Code Playgroud)
警告消息:1:在 is.na(e1) | 中 is.na(e2) : 较长的对象长度不是较短对象长度的倍数 2: In ==.default(State, c("AL", "MO", "TX")) : 较长对象长度不是较短对象的倍数长度
我尝试过其他变量也得到相同的结果
temp<-subset(taxes,StateFullName==c("Iowa","Missouri","Texas"))
Run Code Online (Sandbox Code Playgroud)
警告消息:在 StateFullName == c("Iowa", "Missouri", "Texas") 中:较长的对象长度不是较短对象长度的倍数
关于为什么我的 obs 限制为 250 个,有什么想法吗?
你只需要%in%比较> 1vector即length
subset(taxes, State %in% c('AL', 'MO', 'TX'))
# State amount
#4 MO 14143
#27 TX 11517
#30 AL 14465
Run Code Online (Sandbox Code Playgroud)
或者使用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
Run Code Online (Sandbox Code Playgroud)
要了解代码不起作用的原因,让我们检查逻辑向量输出。
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
Run Code Online (Sandbox Code Playgroud)
警告消息:1:在 is.na(e1) | 中 is.na(e2) :较长的对象长度不是较短对象长度的倍数
没有任何元素适用TRUE于本示例。它的比较方式是基于回收。'State' 的前 3 个元素按顺序与向量 'AL'、'MO' 和 'TX' 进行比较
taxes$State[1:3] == c('AL', 'MO', 'TX')
#[1] FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
在这里,我们逐个元素比较向量的相应值,如下所示:
taxes$State[1:3]
#[1] AK AL AR
Run Code Online (Sandbox Code Playgroud)
与相应位置的'AL'、'MO'和'TX'不匹配,则返回'FALSE'。
同样的方式,它与“State”列进行比较length,即下一个比较是
taxes$State[4:6] == c('AL', 'MO', 'TX')
#[1] FALSE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
这里也都是FALSE因为相应的“状态”元素是“AZ”、“CA”和“CO”。我们最后收到警告,因为
nrow(taxes)
#[1] 50
Run Code Online (Sandbox Code Playgroud)
50%%3!=0
如果nrow数据集的 是51,则不会出现警告,但由于比较是基于位置的,我们可能不会得到预期的结果。
set.seed(24)
taxes <- data.frame(State=sample(state.abb),
amount=sample(400:20000, 50, replace=TRUE), stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)