首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R中的gather()函数在我的列存在时找不到它们

R中的gather()函数在我的列存在时找不到它们
EN

Stack Overflow用户
提问于 2020-12-17 12:00:55
回答 1查看 110关注 0票数 0

我有一个数据帧,它详细说明了从babynames库中获取的长度超过5个字母的名称和长度小于5个字母的名称的计数,该库是从install.packages("babynames")获取的,然后是library(babynames)

在使用str_length(name)进行了一些过滤和ifelse之后,我创建了一个数据帧,如下所示:

代码语言:javascript
运行
复制
sum_greaterthan5.sum     sum_lessthan5.sum     total_n_names.total_names
2109449                  1436852               3546301

我想收集数据,这样我就可以有一个变量/列作为数值,表示有多少婴儿的名字超过5个字母,依此类推……

代码语言:javascript
运行
复制
criteria                    count
sum_greaterthan5.sum        2109449                  
sum_lessthan5.sum           1436852               
total_n_names.total_names   3546301

但是,gather函数没有正确读取我的列:

代码语言:javascript
运行
复制
> df_5letters <- df %>%
+   gather(key=criteria, value = count, c('sum_greaterthan5.sum', 'sum_lessthan5.sum', 'total_n_names.sum') )

Error: Can't subset columns that don't exist.
x Column `sum_greaterthan5.sum` doesn't exist.

我尝试使用列索引,但得到了一个与类型相关的错误。有没有其他函数可以用来代替gather,或者我可以用其他方法修改我的gather函数?

下面是我运行到这一步的代码:

代码语言:javascript
运行
复制
babynames_2017_length_5 <- babynames_2017 %>%
  mutate(five_letters = ifelse(str_length(name)>5,1,0)) %>%
  filter(five_letters == 1) %>%
  summarise(sum = sum(n))

babynames_2017_less_5 <- babynames_2017 %>%
  mutate(five_letters = ifelse(str_length(name)>5,1,0)) %>%
  filter(five_letters == 0) %>%
  summarise(sum = sum(n))

df <- tibble(
  sum_greaterthan5 = babynames_2017_length_5,
  sum_lessthan5 = babynames_2017_less_5,
  total_n_names = total_n # total_n was a variable that I got from a previous dataframe that I did a sum aggregation on with:
# total_n <- babynames_startwvowels[1,1]
)
EN

回答 1

Stack Overflow用户

发布于 2020-12-17 12:06:41

babynames_2017_length_5babynames_2017_less_5是一个数据帧,当您在tibble(..)中使用它时,您正在创建一个嵌套的数据帧,因此gather找不到该列。

从数据帧中提取列,它应该可以很好地工作。

代码语言:javascript
运行
复制
df <- tibble(
  sum_greaterthan5 = babynames_2017_length_5$sum,
  sum_lessthan5 = babynames_2017_less_5$sum,
  total_n_names = total_n 
)

此外,您可以这样做,而不是创建两个单独的数据帧来组合它们,然后使用gather/pivot_longer

代码语言:javascript
运行
复制
babynames %>%
  group_by(five_letters = ifelse(str_length(name)>5, 
                          'sum_greaterthan5', 'sum_lessthan5')) %>%
  summarise(sum = sum(n))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65334544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档