将数据框中的字符串转换为向量并取消嵌套数据框
Transform a string in a data frame to a vector and unnest the data frame
给定一个数据框,其中一列中的每个观察值都是 "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个例子是不可能的,因为有很多案例..
我该如何制作这段代码??
由于您的 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" 字符串和 return 您想要的整数向量,但我认为这个解决方案具有最少打字(我想?)。
无论您如何操作,您现在都有一个 B 列,其中每个观察值都是一个整数向量。
> df
A B
1 A1 -1, 0, 1
2 A2 1, 2, 3
3 A3 2, 3, 4
对于最后一步,使用 tidyr 函数 unnest 取消嵌套 B 中的向量。这将根据需要自动在行中重复 A 列值。
> 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
给定一个数据框,其中一列中的每个观察值都是 "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个例子是不可能的,因为有很多案例.. 我该如何制作这段代码??
由于您的 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" 字符串和 return 您想要的整数向量,但我认为这个解决方案具有最少打字(我想?)。
无论您如何操作,您现在都有一个 B 列,其中每个观察值都是一个整数向量。
> df
A B
1 A1 -1, 0, 1
2 A2 1, 2, 3
3 A3 2, 3, 4
对于最后一步,使用 tidyr 函数 unnest 取消嵌套 B 中的向量。这将根据需要自动在行中重复 A 列值。
> 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