尝试分离列时出现错误,错误信息为“在 UseMethod("mutate") 中出错:对于类别为 'function' 的对象未应用可适用的 'mutate' 方法”。

6

我有这个数据集

# A tibble: 268 x 1
   `Which of these social media platforms do you have an account in right now?`
   <chr>                                                                       
 1 Facebook, Instagram, Twitter, Snapchat, Reddit, Signal                      
 2 Reddit                                                                      
 3 Facebook, Instagram, Twitter, Linkedin, Snapchat, Reddit, Quora             
 4 Facebook, Instagram, Twitter, Snapchat                                      
 5 Facebook, Instagram, TikTok, Snapchat                                       
 6 Facebook, Instagram, Twitter, Linkedin, Snapchat                            
 7 Facebook, Instagram, TikTok, Linkedin, Snapchat, Reddit                     
 8 Facebook, Instagram, Snapchat                                               
 9 Linkedin, Reddit                                                            
10 Facebook, Instagram, Twitter, TikTok                                        
# ... with 258 more rows

我希望将此内容拆分为多个列,并在每个变量上标记“是”和“否”,如下所示:

# A tibble: 268 x 8
      Id Facebook Instagram Reddit Signal Snapchat TikTok Twitter
   <int> <chr>    <chr>     <chr>  <chr>  <chr>    <chr>  <chr>  
 1     1 No       No        No     No     No       No     Yes    
 2     2 Yes      Yes       No     No     Yes      No     Yes    
 3     3 No       Yes       No     Yes    No       Yes    No     
 4     4 No       Yes       No     No     Yes      No     No     
 5     5 No       Yes       No     Yes    Yes      Yes    Yes    
 6     6 No       Yes       No     No     No       No     No     
 7     7 No       No        Yes    Yes    No       Yes    Yes    
 8     8 No       No        Yes    No     No       No     Yes    
 9     9 No       No        Yes    No     Yes      Yes    No     
10    10 No       Yes       Yes    Yes    Yes      No     Yes

因此,我编写了这段代码来实现这个目的。

library(tidyverse)
library(tidytext)

Survey %>%
  mutate(Id = row_number(), HasAccount = "Yes") %>%
  unnest_tokens(Network, `Which of these social media platforms do you have an account in right now?`, to_lower = F) %>%
  spread(Network, HasAccount, fill = "No")

但是我遇到了这个错误

Erreur : Must extract column with a single valid subscript.
x Subscript `var` has size 268 but must be size 1.

> dput(head(Survey[1:5]))
structure(list(Horodateur = structure(c(1619171956.596, 1619172695.039, 
1619173104.83, 1619174548.534, 1619174557.538, 1619174735.457
), tzone = "UTC", class = c("POSIXct", "POSIXt")), `To_which_gender_you_identify_the_most?` = c("Male", 
"Female", "Male", "Female", "Female", "Female"), What_is_your_age_group = c("[18-24[", 
"[10,18[", "[18-24[", "[18-24[", "[18-24[", "[25,34["), How_much_time_do_you_spend_on_social_media = c("1-5 hours", 
"1-5 hours", ">10 hours", "5-10 hours", "5-10 hours", "1-5 hours"
), `Which_of_these_social_media_platforms_do_you_have_an_account_in_right_now?` = c("Facebook, Instagram, Twitter, Snapchat, Reddit, Signal", 
"Reddit", "Facebook, Instagram, Twitter, Linkedin, Snapchat, Reddit, Quora", 
"Facebook, Instagram, Twitter, Snapchat", "Facebook, Instagram, TikTok, Snapchat", 
"Facebook, Instagram, Twitter, Linkedin, Snapchat")), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))

编辑:基于@CSJCampbell的答案编辑了问题。 编辑:添加了我正在使用的数据集片段。


对我来说它运行得很好。请指定 packageVersion('dplyr')packageVersion('tidytext') 并检查是否有任何被屏蔽的函数。 - akrun
@akrun ````> packageVersion('dplyr') [1] ‘1.0.6’
packageVersion('tidytext') [1] ‘0.3.1’````
@akrun,执行以上命令可以查看dplyrtidytext包的版本号。dplyr当前版本为1.0.6,tidytext当前版本为0.3.1。
- wageeh
我认为根据下面的解决方案,你的数据集对象可能与 df 不同的名称。 - akrun
@akrun 我已经修复了,但出现了另一个错误。我编辑了问题。 - wageeh
2个回答

5
mutate的第一个参数必须是一个数据框(data.frame)。你没有将你的数据框命名为df,所以函数df被传递给mutate函数。
args(df)
# function (x, df1, df2, ncp, log = FALSE) 
# NULL

编辑:在您更新后,您添加了dput输出的数据。运行您的代码会给出以下错误:

Survey %>%
    mutate(Id = row_number(), HasAccount = "Yes") %>%
    unnest_tokens(Network, `Which of these social media platforms do you have an account in right now?`, to_lower = F)
# Error in check_input(x) : 
# Input must be a character vector of any length or a list of character
# vectors, each of which has a length of 1.

你的 dput 中有使用下划线命名的列:
colnames(Survey)[5]
# "Which_of_these_social_media_platforms_do_you_have_an_account_in_right_now?"

重命名列:

Survey %>%
    transmute(Id = row_number(), HasAccount = "Yes", 
        Platforms = `Which_of_these_social_media_platforms_do_you_have_an_account_in_right_now?`) %>% 
    unnest_tokens(Network, Platforms) %>% 
    spread(Network, HasAccount, fill = "No")
# # A tibble: 6 x 10
#      Id facebook instagram linkedin quora reddit
#   <int> <chr>    <chr>     <chr>    <chr> <chr> 
# 1     1 Yes      Yes       No       No    Yes   
# 2     2 No       No        No       No    Yes   
# 3     3 Yes      Yes       Yes      Yes   Yes   
# 4     4 Yes      Yes       No       No    No    
# 5     5 Yes      Yes       No       No    No    
# 6     6 Yes      Yes       Yes      No    No    
# # … with 4 more variables: signal <chr>,
# #   snapchat <chr>, tiktok <chr>, twitter <chr>

是的,我的数据框架名为Survey,现在我收到了这个错误消息 Erreur : 必须使用单个有效下标提取列。x 下标 `var` 的大小为268,但必须为1。 - wageeh
1
@wageeh 在你的修改后,我无法重现你的错误,代码在 Survey 数据框上按照你的期望为我工作。 - CSJCampbell
我打算重新安装R和Rstudio,我认为我可能有包的问题或其他什么问题。 - wageeh
@wageeh,我认为这不是安装问题,看起来像是把长度为268的列传递到了错误的参数或其他地方。您能否创建一个可重现的示例,在干净的环境中运行一些代码并查看相同的错误?您可以使用dput输出表格片段。 - CSJCampbell
我编辑了问题并添加了一个dput,这是你需要的吗? - wageeh
@wageeh,看起来你的列名有下划线,并且无法被unnest_tokens找到。 - CSJCampbell

2

虽然不是对这个确切问题的答案,但与帖子标题足够相似,我认为它很相关...

我遇到了一个非常类似的错误,原因略有不同(但相关),即我混淆了ggplot和管道符号(%>% )的语法。我写成:

df %>%                 # <- pipe
   summarize(...) +    # <- NOT a pipe!
   mutate(...)

导致错误的结果为:
Error in UseMethod("mutate") : no applicable method for 'mutate' applied to an object of class "name"

正如接受的答案所述,这是由于mutate()没有将数据框作为其第一个参数。我将其添加为答案而不是评论,以突出这种错误,在tidyverse内工作时可能很容易犯错,特别是在操作数据和更新图形之间切换时,但一开始可能并不明显。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接