R子集返回带有警告的有限集

R子集返回带有警告的有限集,r,subset,R,Subset,我有一个带有12500 obs的data.frame。共8个变量,其中一个是State(taxes$State)。我想将数据细分为多个状态,这些状态是我在Shiny中从用户输入中获得的,但当我添加多个状态时,我会不断得到丢弃的数据。我已经深入到了行为古怪的子集函数。只有两个状态没有收到任何警告,但第三个状态抛出异常。在任何情况下,我都被限制在250个OB。回来的时候。比如说 temp<-subset(taxes, State==c("AL","MO",TX)) 警告信息: 在StateF

我有一个带有12500 obs的data.frame。共8个变量,其中一个是State(taxes$State)。我想将数据细分为多个状态,这些状态是我在Shiny中从用户输入中获得的,但当我添加多个状态时,我会不断得到丢弃的数据。我已经深入到了行为古怪的子集函数。只有两个状态没有收到任何警告,但第三个状态抛出异常。在任何情况下,我都被限制在250个OB。回来的时候。比如说

temp<-subset(taxes, State==c("AL","MO",TX))
警告信息: 在StateFullName==c(“爱荷华州”、“密苏里州”、“德克萨斯州”): 较长的对象长度不是较短对象长度的倍数


关于我为什么被限制在250个OB,你有什么想法吗?

函数中的逻辑表达式与你想要的不一致。它正在寻找一个等于向量
c(“AL”、“MO”、“TX”)
的观测值。由于12500是2的倍数,
subset
尝试考虑向量中的两个元素进行子集设置。因为12500不是3的倍数,所以当向量有三个元素并抛出警告时,它不能使用相同的过程

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

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

temp函数中的逻辑表达式与您想要的不符。它正在寻找一个等于向量
c(“AL”、“MO”、“TX”)
的观测值。由于12500是2的倍数,
subset
尝试考虑向量中的两个元素进行子集设置。因为12500不是3的倍数,所以当向量有三个元素并抛出警告时,它不能使用相同的过程

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

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

temp您只需要
%in%
来比较
长度
为1的
向量
,即

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
),将
列设置为“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:In is.na(e1)| is.na(e2):较长的对象长度 不是较短对象长度的倍数

在本例中,没有一个元素是
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”不匹配,则返回“FALSE”

同样,将其与“状态”列的
长度进行比较,即下一次比较为

 taxes$State[4:6] == c('AL', 'MO', 'TX')
 #[1] FALSE FALSE FALSE
这里也都是
FALSE
,因为对应的“State”元素是“AZ”、“CA”和“CO”。我们在最后得到一个警告,因为

 nrow(taxes)
 #[1] 50
50%%3!=0

如果数据集的
nrow
51
,则警告将不存在,但由于比较是基于位置的,我们可能无法得到预期的结果

数据
set.seed(24)

税您只需在%
中使用
%来比较
长度
为1的
向量,即

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
),将
列设置为“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:In is.na(e1)| is.na(e2):较长的对象长度 不是较短对象长度的倍数

在本例中,没有一个元素是
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”不匹配,则返回“FALSE”

同样,将其与“状态”列的
长度进行比较,即下一次比较为

 taxes$State[4:6] == c('AL', 'MO', 'TX')
 #[1] FALSE FALSE FALSE
这里也都是
FALSE
,因为对应的“State”元素是“AZ”、“CA”和“CO”。我们在最后得到一个警告,因为

 nrow(taxes)
 #[1] 50
50%%3!=0

如果数据集的
nrow
51
,则警告将不存在,但由于比较是基于位置的,我们可能无法得到预期的结果

数据
set.seed(24)

税务是的。所以我不知道或不理解的是,因为我从未对子集使用过向量,子集将c(a,b,c)视为序列,而不是单个匹配的列表。感谢所有人的帮助!

是的。所以我不知道或不理解的是,因为我从未对子集使用过向量,所以子集将c(a,b,c)视为序列作为序列而不是单个匹配的列表。感谢所有人的帮助