tidyverse 中字符串变量的条件连接
Conditional concatenation of string variables in tidyverse
我正在尝试使用 tidyverse 有条件地连接字符串变量。
这是玩具数据
df <- tibble(id = paste0("id_", 1:4),
outcome = rep(x = c("simon",
"garfunkel"),
times = 2),
worth = rep(x = c("awesome",
"disposable"),
times = 2))
df
# id outcome worth
# <chr> <chr> <chr>
# 1 id_1 simon awesome
# 2 id_2 garfunkel disposable
# 3 id_3 simon awesome
# 4 id_4 garfunkel disposable
我可以使用 tidyr
中的 unite()
像这样组合 id
列和 'worth' 列
df %>%
unite("id", c(id, worth))
# id outcome
# <chr> <chr>
# 1 id_1_awesome simon
# 2 id_2_disposable garfunkel
# 3 id_3_awesome simon
# 4 id_4_disposable garfunkel
但是这有一些问题,输出有一些问题,我生成它的方式也有一些问题。
首先,我想保留原始列,而 unite()
只是连接两列 。我在 mutate
中尝试了 unite
但这产生了一个错误。
其次,也是最重要的,而不是简单地连接一个列,我想使新的并列 id
列成为 id
列和 worth
列,但 以 outcome
列 . 为条件我尝试在 mutate()
中使用 case_when()
来做到这一点,但我很困惑 paste0()
函数 and/or 是否可以在 case_when()
中使用 unite()
.
第三,与第二点相关,我只需要将 worth
列的 部分 连接到 id
column. 理想情况下使用正则表达式替换,仅捕获 worth
column
的前 x 个字母
基本上我需要新数据集看起来像下面的数据框,但使用条件和字符串连接机制
tibble(id = paste0(paste0("id_", 1:4),
rep(c("_awes", "_disp"))),
outcome = rep(x = c("simon",
"garfunkel"),
times = 2),
worth = rep(x = c("awesome",
"disposable"),
times = 2))
# id outcome worth
# <chr> <chr> <chr>
# 1 id_1_awes simon awesome
# 2 id_2_disp garfunkel disposable
# 3 id_3_awes simon awesome
# 4 id_4_disp garfunkel disposable
非常感谢任何帮助。
(p.s。如果您认为加芬克尔也很棒,我们深表歉意)
df %>%
mutate(worth1 = substr(worth, 1, 4)) %>%
unite(id, id, worth1)
# A tibble: 4 x 3
id outcome worth
<chr> <chr> <chr>
1 id_1_awes simon awesome
2 id_2_disp garfunkel disposable
3 id_3_awes simon awesome
4 id_4_disp garfunkel disposable
我举了一个非常令人困惑的例子,正如@camille 指出的那样,它有一些冗余,因为我想作为条件的列遵循与我想提取的列相同的模式,因此不需要完全调理。我只能说是我的错。然而,由于人们已经提供了基于原始的、令人困惑的数据集的解决方案,我将按原样保留示例。根据他们的回答,以下是我正在寻找的内容
df %>%
mutate(newid = case_when(outcome == "simon" ~ paste(id, substr(worth, 1, 4), sep = "_"),
outcome == "garfunkel" ~ paste(id, substr(worth, 1, 4), sep = "_")))
# id outcome worth newid
# <chr> <chr> <chr> <chr>
# 1 id_1 simon awesome id_1_awes
# 2 id_2 garfunkel disposable id_2_disp
# 3 id_3 simon awesome id_3_awes
# 4 id_4 garfunkel disposable id_4_disp
此解决方案以 outcome
变量为条件,但 提取 worth
变量的前四个字符并将其与 `id 变量组合。感谢响应者帮助我解决这个问题。
我正在尝试使用 tidyverse 有条件地连接字符串变量。
这是玩具数据
df <- tibble(id = paste0("id_", 1:4),
outcome = rep(x = c("simon",
"garfunkel"),
times = 2),
worth = rep(x = c("awesome",
"disposable"),
times = 2))
df
# id outcome worth
# <chr> <chr> <chr>
# 1 id_1 simon awesome
# 2 id_2 garfunkel disposable
# 3 id_3 simon awesome
# 4 id_4 garfunkel disposable
我可以使用 tidyr
中的 unite()
像这样组合 id
列和 'worth' 列
df %>%
unite("id", c(id, worth))
# id outcome
# <chr> <chr>
# 1 id_1_awesome simon
# 2 id_2_disposable garfunkel
# 3 id_3_awesome simon
# 4 id_4_disposable garfunkel
但是这有一些问题,输出有一些问题,我生成它的方式也有一些问题。
首先,我想保留原始列,而 unite()
只是连接两列 。我在 mutate
中尝试了 unite
但这产生了一个错误。
其次,也是最重要的,而不是简单地连接一个列,我想使新的并列 id
列成为 id
列和 worth
列,但 以 outcome
列 . 为条件我尝试在 mutate()
中使用 case_when()
来做到这一点,但我很困惑 paste0()
函数 and/or 是否可以在 case_when()
中使用 unite()
.
第三,与第二点相关,我只需要将 worth
列的 部分 连接到 id
column. 理想情况下使用正则表达式替换,仅捕获 worth
column
基本上我需要新数据集看起来像下面的数据框,但使用条件和字符串连接机制
tibble(id = paste0(paste0("id_", 1:4),
rep(c("_awes", "_disp"))),
outcome = rep(x = c("simon",
"garfunkel"),
times = 2),
worth = rep(x = c("awesome",
"disposable"),
times = 2))
# id outcome worth
# <chr> <chr> <chr>
# 1 id_1_awes simon awesome
# 2 id_2_disp garfunkel disposable
# 3 id_3_awes simon awesome
# 4 id_4_disp garfunkel disposable
非常感谢任何帮助。
(p.s。如果您认为加芬克尔也很棒,我们深表歉意)
df %>%
mutate(worth1 = substr(worth, 1, 4)) %>%
unite(id, id, worth1)
# A tibble: 4 x 3
id outcome worth
<chr> <chr> <chr>
1 id_1_awes simon awesome
2 id_2_disp garfunkel disposable
3 id_3_awes simon awesome
4 id_4_disp garfunkel disposable
我举了一个非常令人困惑的例子,正如@camille 指出的那样,它有一些冗余,因为我想作为条件的列遵循与我想提取的列相同的模式,因此不需要完全调理。我只能说是我的错。然而,由于人们已经提供了基于原始的、令人困惑的数据集的解决方案,我将按原样保留示例。根据他们的回答,以下是我正在寻找的内容
df %>%
mutate(newid = case_when(outcome == "simon" ~ paste(id, substr(worth, 1, 4), sep = "_"),
outcome == "garfunkel" ~ paste(id, substr(worth, 1, 4), sep = "_")))
# id outcome worth newid
# <chr> <chr> <chr> <chr>
# 1 id_1 simon awesome id_1_awes
# 2 id_2 garfunkel disposable id_2_disp
# 3 id_3 simon awesome id_3_awes
# 4 id_4 garfunkel disposable id_4_disp
此解决方案以 outcome
变量为条件,但 提取 worth
变量的前四个字符并将其与 `id 变量组合。感谢响应者帮助我解决这个问题。