首页 > 解决方案 > 在R中将奇怪的宽格式重塑为长

问题描述

我有一个以这种方式的数据集。请注意,这var2character

var1 var2
a    "b:2, d:4"
b    "a:1, b:3, c:4, d:2"
c    "a:3"
d    "b:2, d:4, a:1"

我想把它改造成长格式

var1 var2 value
a    b    2
a    d    4
b    a    1
b    b    3
...
d    d    4
d    a    1

我很想遍历这些行,但速度对我来说是一个问题。实现这一点的更有效方法是什么?

标签: rdataframe

解决方案


您可以使用separate_rows逗号 ( ,)separate来获取不同行中的数据,并使用冒号 ( :) 来获取不同列中的数据。

library(tidyr)
df %>%
  separate_rows(var2, sep = ',\\s*') %>%
  separate(var2, c('var2', 'value'), sep = ':', convert = TRUE)

# A tibble: 10 x 3
#   var1  var2  value
#   <chr> <chr> <int>
# 1 a     b         2
# 2 a     d         4
# 3 b     a         1
# 4 b     b         3
# 5 b     c         4
# 6 b     d         2
# 7 c     a         3
# 8 d     b         2
# 9 d     d         4
#10 d     a         1

数据

df <- structure(list(var1 = c("a", "b", "c", "d"), var2 = c("b:2, d:4", 
"a:1, b:3, c:4, d:2", "a:3", "b:2, d:4, a:1")), class = "data.frame",
row.names = c(NA, -4L))

推荐阅读