r - 在 dplyr::mutate 中使用 strsplit (没有 tibble::data_frame)会引发 "Evaluation error: non-character argument"

标签 r regex strsplit dplyr

编辑:我的 df 有一个拼写错误创作,缺少 _ MediaName 的最后一个值;现在已更正此问题。

我想创建一个新变量TrialId在数据框中作为另一个变量值的一部分 MediaName取决于第三个变量 Phase 的值,并认为我可以使用 strsplit 来做到这一点和ifelsedplyr::mutate内如下:

library(dplyr)

# Creating a simple data frame for the example
df <- data.frame(Phase = c(rep("Familiarisation",8),rep("Test",3)),
                 MediaName = c("Flip_A1_G1","Reg_B2_S1","Reg_A2_G1","Flip_B1_S1",
                               "Reg_A1_G2","Flip_B2_S2","Reg_A2_G2","Flip_B1_S2",
                               "HC_A1L","TC_B1R","RC_BL_2R"))

# Creating a new column
df <- df %>%
  mutate(TrialId = ifelse(Phase == "Familiarisation",
                          sapply(strsplit(MediaName, "_"), "[", 2),
                          sapply(strsplit(MediaName, "_"), "[", 1)))

预期结果是

> df$TrialId
[1] "A1" "B2" "A2" "B1" "A1" "B2" "A2" "B1" "HC" "TC" "RC"

但是,这给了我以下错误,因为我相信 strsplit :

Error in mutate_impl(.data, dots) : 
  Evaluation error: non-character argument.

我从this SO question知道在这个小例子中,我可以通过将我的数据框定义为 tibble::data_frame 来轻松解决我的问题,不知道为什么这可以解决问题。尽管在我的实际代码 df 中我不能完全做到这一点来自读取 csv 文件(带有 read.csv() )。我一直在想使用df <- df %>% as_tibble() %>% mutate(...)会以类似的方式解决问题,但事实并非如此(为什么?)。

有没有办法实际使用 tibble即使在读取文件时?或者是否有另一种方法可以实现我需要做的事情,而不使用 strsplit也许?

我还在阅读this other SO question您可以使用tidyr::separate但它并没有完全按照我想要的方式进行,因为我需要根据 Phase 的值保留第一个或第二个值.

最佳答案

你可以尝试:

library(tidyverse)
# your first data 
df_old <- data.frame(Phase = c(rep("Familiarisation",8),rep("Test",3)),
                 MediaName = c("Flip_A1_G1","Reg_B2_S1","Reg_A2_G1","Flip_B1_S1",
                               "Reg_A1_G2","Flip_B2_S2","Reg_A2_G2","Flip_B1_S2",
                               "HC_A1L","TC_B1R","RC_BL2R"))
df_old %>% 
  separate(MediaName, into=letters[1:3], sep="_", fill = "left", remove = FALSE) %>% 
  select(Phase, MediaName, TrialId=b)
             Phase  MediaName TrialId
1  Familiarisation Flip_A1_G1      A1
2  Familiarisation  Reg_B2_S1      B2
3  Familiarisation  Reg_A2_G1      A2
4  Familiarisation Flip_B1_S1      B1
5  Familiarisation  Reg_A1_G2      A1
6  Familiarisation Flip_B2_S2      B2
7  Familiarisation  Reg_A2_G2      A2
8  Familiarisation Flip_B1_S2      B1
9             Test     HC_A1L      HC
10            Test     TC_B1R      TC
11            Test    RC_BL2R      RC

这是根据提供的示例数据的硬编码解决方案。用"_"分隔,如果只有两个而不是三个"_",则从左侧填充NA。最后,选择您需要的列。

编辑

对于新数据,情况会稍微复杂一些。但你可以尝试:

df %>% 
  add_column(MediaName_keep=df$MediaName) %>% 
  group_by(MediaName_keep) %>% 
  separate_rows(MediaName, sep="_") %>% 
  mutate(n=1:n()) %>% 
  filter((Phase == "Familiarisation" & n == 2) | (Phase == "Test" & n == 1)) %>% 
  select(Phase, MediaName=MediaName_keep, TrialId=MediaName)
# A tibble: 11 x 3
# Groups:   MediaName [11]
             Phase  MediaName TrialId
            <fctr>     <fctr>   <chr>
 1 Familiarisation Flip_A1_G1      A1
 2 Familiarisation  Reg_B2_S1      B2
 3 Familiarisation  Reg_A2_G1      A2
 4 Familiarisation Flip_B1_S1      B1
 5 Familiarisation  Reg_A1_G2      A1
 6 Familiarisation Flip_B2_S2      B2
 7 Familiarisation  Reg_A2_G2      A2
 8 Familiarisation Flip_B1_S2      B1
 9            Test     HC_A1L      HC
10            Test     TC_B1R      TC
11            Test   RC_BL_2R      RC

这个想法是一样的。分开,但此时通过 MediaName_keep 添加并计算新行,然后根据您的需要进行过滤。

关于r - 在 dplyr::mutate 中使用 strsplit (没有 tibble::data_frame)会引发 "Evaluation error: non-character argument",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47675557/

相关文章:

java - 在 OSX 10.7.2 上设置 R 和 Java 应用程序

regex - 在 PostgreSQL 中剥离 HTML 标签

r - Strsplit后,输出不是预期的格式

r - 如何从 R 中的嵌套 for 循环创建向量?

javascript - 通过R中的串扰使用选择框在R plotly图中选择默认值,使用静态html不 Shiny

r - 将自定义包添加到 Azure 机器学习工作室

正则表达式搜索忽略字符串中的单词

android - 正则表达式验证 PAN 卡号

r - 取消列出并拆分列以添加到行而不会丢失 R 中其他列的信息

r - 使用 R,strsplit 如何在要拆分的字符串末尾使用拆分器处理固定元素?