gpt4 book ai didi

R dplyr,将 mutate 与 na.omit 一起使用会导致错误大小不兼容 (%d)

转载 作者:行者123 更新时间:2023-12-04 12:33:33 24 4
gpt4 key购买 nike

我在做数据清理。我在 Dplyr 中经常使用 mutate,因为它会逐步生成新的列,我可以很容易地看到它是如何进行的。

这是我遇到此错误的两个示例

Error: incompatible size (%d), expecting %d (the group size) or 1

示例 1:从邮政编码中获取城镇名称。数据很简单:
    Zip
1 02345
2 02201

我注意到当数据中有 NA 时,它不起作用。

没有 NA 它可以工作:
library(dplyr)
library(zipcode)
data(zipcode)

test = data.frame(Zip=c('02345','02201'),stringsAsFactors=FALSE)

test %>%
rowwise() %>%
mutate( Town1 = zipcode[zipcode$zip==na.omit(Zip),'city'] )

导致
Source: local data frame [2 x 2]
Groups: <by row>

Zip Town1
1 02345 Manomet
2 02201 Boston

使用 NA 它不起作用:
library(dplyr)
library(zipcode)
data(zipcode)

test = data.frame(Zip=c('02345','02201',NA),stringsAsFactors=FALSE)

test %>%
rowwise() %>%
mutate( Town1 = zipcode[zipcode$zip==na.omit(Zip),'city'] )

导致
Error: incompatible size (%d), expecting %d (the group size) or 1

例2。我想摆脱以下数据中城镇列中出现的冗余州名。
         Town State
1 BOSTON MA MA
2 NORTH AMAMS MA
3 CHICAGO IL IL

这就是我的做法:
(1) 将 Town 中的字符串拆分为单词,例如'BOSTON' 和 'MA' 用于第 1 行。
(2) 查看这些单词中是否有与该行的 State 匹配
(3) 删除匹配的词
library(dplyr)
test = data.frame(Town=c('BOSTON MA','NORTH AMAMS','CHICAGO IL'), State=c('MA','MA','IL'), stringsAsFactors=FALSE)

test %>%
mutate(Town.word = strsplit(Town, split=' ')) %>%
rowwise() %>% # rowwise ensures every calculation only consider currect row
mutate(is.state = match(State,Town.word ) ) %>%
mutate(Town1 = Town.word[-is.state])

这导致:
         Town State Town.word is.state   Town1
1 BOSTON MA MA <chr[2]> 2 BOSTON
2 NORTH AMAMS MA <chr[2]> NA NA
3 CHICAGO IL IL <chr[2]> 2 CHICAGO

含义:例如,第 1 行显示 is.state==2,意思是 Town 中的第二个单词是州名。去掉那个工作后,Town1 是正确的城镇名称。

现在我想修复第 2 行中的 NA,但添加 na.omit 会导致错误:
test %>%
mutate(Town.word = strsplit(Town, split=' ')) %>%
rowwise() %>% # rowwise ensures every calculation only consider currect row
mutate(is.state = match(State,Town.word ) ) %>%
mutate(Town1 = Town.word[-na.omit(is.state)])

结果是:
Error: incompatible size (%d), expecting %d (the group size) or 1

我检查了数据类型和大小:
test %>%
mutate(Town.word = strsplit(Town, split=' ')) %>%
rowwise() %>% # rowwise ensures every calculation only consider currect row
mutate(is.state = match(State,Town.word ) ) %>%
mutate(length(is.state) ) %>%
mutate(class(na.omit(is.state)))

结果是:
         Town State Town.word is.state length(is.state) class(na.omit(is.state))
1 BOSTON MA MA <chr[2]> 2 1 integer
2 NORTH AMAMS MA <chr[2]> NA 1 integer
3 CHICAGO IL IL <chr[2]> 2 1 integer

所以它是 %d 的长度==1。有人可以出什么问题吗?谢谢

最佳答案

可以吗sub出来?

test %>%
rowwise() %>%
mutate(Town=sub(sprintf('[, ]*%s$', State), '', Town))
## Source: local data frame [3 x 2]
## Groups: <by row>
##
## Town State
## 1 BOSTON MA
## 2 NORTH AMAMS MA
## 3 CHICAGO IL

(如果发生这种情况,这种方式也会在城镇之后捕获逗号。)

注意:如果您使用 ungroup()这里有一个 rowwise_df (照原样),它将删除 tbl_df类并输出一个直接的 data.frame,这对您的数据很好,但如果您不小心并且正在查看大量数据(我已经做过无数次),则会破坏您的屏幕。 (Github 引用 #936#553。)

关于R dplyr,将 mutate 与 na.omit 一起使用会导致错误大小不兼容 (%d),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30747942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com