给定一个数据框,其中列中的每个观察是一个形式为" x~y"其中x和y是整数。
目标是改变" x~y"字符串到一个向量中,c(x..y)是一个以整数x开头并以整数y结尾的数字序列。
最后,数据框需要被取消,以便向量的每个元素都有自己的行,其他列被正确重复。
例如,这是一个数据框:
A B
A1 -1~1
A2 1~3
A3 2~4
上述数据框应更改为以下内容:
A B
A1 -1
A1 0
A1 1
A2 1
A2 2
A2 3
A3 2
A3 3
A3 4
由于存在大量案例,因此无法设置str_replace示例。 我该如何制作这段代码?
答案 0 :(得分:1)
由于您的B列可以很容易地转换为一个表达式,可以提供您想要的内容,我将使用以下方法。
# Using tidyverse for stringr (str_replace), tidyr (unnest), and purrr (map)
library(tidyverse)
# recreating your dataframe
df <- data.frame(A=c("A1","A2","A3"),B=c("-1~1","1~3","2~4"), stringsAsFactors = FALSE)
该解决方案包含三个部分。首先将B列中的行转换为seq表达式。因此“x~y”变为“seq(x,y,by = 1)”。
df$B <- str_replace(df$B,"\\~",",")
df$B <- paste("seq(",df$B,",by=1)")
关于R的一个好处是,如果你可以生成包含R表达式的字符串,那么你可以使用“eval(parse())”来评估它们,就像这样...
df$B <- map(df$B, ~ eval(parse(text=.)))
或者,您可以给map()调用一个函数,该函数将获取您原始的“x~y”字符串并返回您想要的整数向量,但我认为此解决方案的键入次数最少(我想? )。
但是你已经完成了,你现在有了一个B列,其中每个观察都是一个整数向量。
> df
A B
1 A1 -1, 0, 1
2 A2 1, 2, 3
3 A3 2, 3, 4
对于最后一步,使用tidyr函数取消B中的向量,不需要。这将根据需要自动重复行中的列值。
> df <- unnest(df)
> df
A B
1 A1 -1
2 A1 0
3 A1 1
4 A2 1
5 A2 2
6 A2 3
7 A3 2
8 A3 3
9 A3 4