gpt4 book ai didi

r - 在 dplyr mutate 调用中添加多列

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

我有一个带有点分隔字符列的数据框:

> set.seed(310366)
> tst = data.frame(x=1:10,y=paste(sample(c("FOO","BAR","BAZ"),10,TRUE),".",sample(c("foo","bar","baz"),10,TRUE),sep=""))
> tst
x y
1 1 BAR.baz
2 2 FOO.foo
3 3 BAZ.baz
4 4 BAZ.foo
5 5 BAZ.bar
6 6 FOO.baz
7 7 BAR.bar
8 8 BAZ.baz

我想将该列拆分为两个新列,其中包含点两侧的部分。 str_split_fixed来自包裹 stringr可以很好地完成这项工作。我所有的值肯定是由一个点分隔的两部分,所以我可以这样做:
> require(stringr)
> str_split_fixed(tst$y,"\\.",2)
[,1] [,2]
[1,] "BAR" "baz"
[2,] "FOO" "foo"
[3,] "BAZ" "baz"
[4,] "BAZ" "foo"
[5,] "BAZ" "bar"
[6,] "FOO" "baz"
[7,] "BAR" "bar"

现在我可以 cbind到我的数据框,但我想我会弄清楚如何在 dplyr 中做到这一点管道。我首先想到的是 mutate可以做到:
> tst %.% mutate(parts=str_split_fixed(y,"\\.",2))
Error: wrong result size (20), expected 10 or 1

我可以得到 mutate分两步做:
> tst %.% mutate(part1=str_split_fixed(y,"\\.",2)[,1], part2=str_split_fixed(y,"\\.",2)[,2])
x y part1 part2
1 1 BAR.baz BAR baz
2 2 FOO.foo FOO foo
3 3 BAZ.baz BAZ baz
4 4 BAZ.foo BAZ foo
5 5 BAZ.bar BAZ bar
6 6 FOO.baz FOO baz

但那是将字符串拆分两次。

迄今为止我在 dplyr 中能做到的“最好”方式是这样的(我只是在写这个问题时才发现的......):
> tst %.% do(cbind(.,data.frame(parts=str_split_fixed(.$y,"\\.",2))))
x y parts.1 parts.2
1 1 BAR.baz BAR baz
2 2 FOO.foo FOO foo
3 3 BAZ.baz BAZ baz
4 4 BAZ.foo BAZ foo
5 5 BAZ.bar BAZ bar

这还不错,但在 R 中失去了很多管道事物的可读性。是否有使用 mutate 的简单方法?我错过了?

最佳答案

您可以使用 separate()来自 tidyr结合 dplyr :

tst %>% separate(y, c("y1", "y2"), sep = "\\.", remove=FALSE)

x y y1 y2
1 1 BAR.baz BAR baz
2 2 FOO.foo FOO foo
3 3 BAZ.baz BAZ baz
4 4 BAZ.foo BAZ foo
5 5 BAZ.bar BAZ bar
6 6 FOO.baz FOO baz
7 7 BAR.bar BAR bar
8 8 BAZ.baz BAZ baz
9 9 FOO.bar FOO bar
10 10 BAR.foo BAR foo

设置 remove=TRUE将删除列 y

关于r - 在 dplyr mutate 调用中添加多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24936330/

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