【问题标题】:Transform a string in a data frame to a vector and unnest the data frame将数据框中的字符串转换为向量并取消嵌套数据框
【发布时间】:2018-06-04 05:34:56
【问题描述】:

给定一个数据框,其中列中的每个观察值都是“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 示例,因为有很多情况.. 如何制作这段代码??

【问题讨论】:

  • dff <- separate_rows(df, B, sep="~"); do.call(bind_rows, lapply(split(dff, dff$A), function(x) { data.frame(A=head(x$A,1), B=seq(min(x$B), max(x$B))) })) 应该这样做。

标签: r split tidyr stringr unnest


【解决方案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 函数 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

【讨论】:

    猜你喜欢
    • 2018-04-08
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多