R子集返回带有警告的有限集
我有一个带有12500 obs的data.frame。共8个变量,其中一个是State(taxes$State)。我想将数据细分为多个状态,这些状态是我在Shiny中从用户输入中获得的,但当我添加多个状态时,我会不断得到丢弃的数据。我已经深入到了行为古怪的子集函数。只有两个状态没有收到任何警告,但第三个状态抛出异常。在任何情况下,我都被限制在250个OB。回来的时候。比如说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
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)视为序列作为序列而不是单个匹配的列表。感谢所有人的帮助