gpt4 book ai didi

r - dplyr mutate + unlist 问题

转载 作者:行者123 更新时间:2023-12-05 04:03:11 26 4
gpt4 key购买 nike

我正在尝试提取数据框中的部分字符。

d<-data.frame(a=c("aa_bb_cc", "ddd_eee_fff", "sss_rrr_eee"))

我想在新列中添加“bb”、“eee”、“rrr”部分。当使用如下结构时,它工作正常:

unlist(str_split(d$a[1],"_"))[2]
unlist(str_split(d$a[2],"_"))[2]

所以我将它应用到 mutate (dplyr) 中:

t<-d %>% mutate(new1=(unlist(str_split(a,"_"))[2])) 

但结果在所有情况下都是“bb”。我做错了什么?

最佳答案

当你这样做的时候

d %>% mutate(new1=(unlist(str_split(a,"_"))[2]))

它传递 str_split 中的 a 列。所以这相当于

unlist(str_split(d$a, "_"))
#[1] "aa" "bb" "cc" "ddd" "eee" "fff" "sss" "rrr" "eee"

现在当你对它进行子集化并得到它给出的第二个元素时

unlist(str_split(d$a, "_"))[2]
#[1] "bb"

因此,这个值被分配给所有的案例。


要解决此问题,您可以添加操作 rowwise 以获得所需的输出,因为它将在 str_split a 的值.

library(tidyverse)

d %>%
rowwise() %>%
mutate(new1= unlist(str_split(a,"_"))[2])

# a new1
# <fct> <chr>
#1 aa_bb_cc bb
#2 ddd_eee_fff eee
#3 sss_rrr_eee rrr

或者另一个更安全的选择是使用separate,根据分隔符将字符串分成不同的列,然后选择相关的列

d %>%
separate(a, into = c("one", "two", "three"), sep = "_", remove = FALSE) %>%
select(a, two)

# a two
#1 aa_bb_cc bb
#2 ddd_eee_fff eee
#3 sss_rrr_eee rrr

显然,您还可以使用 sapplystrsplit

来使用基本 R 选项
sapply(strsplit(as.character(d$a), "_"), "[[", 2)
#[1] "bb" "eee" "rrr"

关于r - dplyr mutate + unlist 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53738857/

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