使用Tidyverse将列表转换为向量

3

这里是《R数据科学》中的一个简单示例:

df <- tribble(
  ~x1,
  "a,b,c",
  "d,e,f,g"
)

现在我可以创建一个类似于这样的列表列:
df <- df %>%
  mutate(x2 = stringr::str_split(x1, ","))

现在数据看起来是这样的:
# A tibble: 2 × 2
       x1        x2
    <chr>    <list>
1   a,b,c <chr [3]>
2 d,e,f,g <chr [4]>

这里是问题:如果我只有x2,如何从中恢复x1? unnest()不能使用,因为它会改变数据的形状。

你可以使用sapply(df$x2, toString)将列表中的向量粘贴在一起,以获取字符串。 - Psidom
谢谢。tidyverse的等效代码如下:df <- df %>% mutate(x3 = map_chr(x2, toString))它会产生以下结果:# A tibble: 2 × 3 x1 x2 x3 1 a,b,c a, b, c 2 d,e,f,g d, e, f, g很好! - Shige Song
2个回答

5

尝试

df %>% 
  mutate(x1_new = map_chr(x2, paste, collapse = ','))

(我假设您已经加载了“purrr”软件包,因为您提到了“tidyverse”)

好的,toString()和paste()都可以做到这一点。谢谢。 - Shige Song
如果你在控制台中输入 toString.default(不带 ?() 的),你会看到默认的实现是 paste(x, collapse = ", ") - hrbrmstr
@hrbrmstr 是的,但这个函数会限制太多自由(sepcollapse),相对于它所做的非常少。 - Jan Kislinger
1
完全同意@JanKislinger。我是在为OP的启蒙而做toString()的笔记。你的方法更好,但在这种情况下,paste0可能是最合适的。 - hrbrmstr

2
非常好。此外,在整洁宇宙中:
df <- df %>% 
  mutate(x3 = map_chr(x2, stringr::str_c, collapse = ','))
df

同样有效。


1
我强烈建议避免使用 stringr 这个工具,直接使用它所包装的 stringi 函数。这样可以少调用一个函数,并且拥有更多的终极力量。 - hrbrmstr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接