R-整理包含列表中数据的多个列

时间:2016-06-15 22:09:22

标签: r data.table

我安排了一个数据集,使得数据存储为每个“单元格”内的多个观察列表。见下文:

partID | Var 1 | Var 2
1      | 1,2,3 | 4,5,6
2      | 7,8,9 | 1,2,3

我想以更像这样的格式获取数据:

partID | Var 1 | Var 2
1      | 1     | 4
1      | 2     | 5
1      | 3     | 6

我一直在尝试meltunlistdata.table的各种组合,但我没有太多运气应用各种方法扩展列表同时保留多列和他们的名字。我是否已缩减为循环数据集并将列绑定在一起?

4 个答案:

答案 0 :(得分:1)

如果对于每一行,单元格具有相同数量的条目并且它们是字符串,则可以使用data.table来执行此操作。

require(data.table)
DT<-data.table(partID=c(1,2),Var1=c("1,2,3","7,8,9"),Var2=c("4,5,6","1,2,3"))

DT2<-DT[,list(Var1=unlist(strsplit(Var1,",")),Var2=unlist(strsplit(Var2,","))),by=partID]

您使用strsplit()按逗号分隔字符串。您使用unlist()将条目转换为向量,而不是列表。

另一方面,如果每个单元格已经是一个列表,那么您需要做的就是unlist()

require(data.table)
DT3<-data.table(partID=c(1,2),Var1=list(c(1,2,3),c(7,8,9)),Var2=list(c(4,5,6),c(1,2,3)))

DT4<-DT3[,list(Var1=unlist(Var1),Var2=unlist(Var2)),by=partID]

无论哪种方式,你得到这个:

   partID Var1 Var2
      1    1    4
      1    2    5
      1    3    6
      2    7    1
      2    8    2
      2    9    3

答案 1 :(得分:1)

我们可以使用cSplit

轻松完成此操作
library(splitstackshape)
cSplit(DT, c("Var1", "Var2"), ",", "long")
#    partID Var1 Var2
#1:      1    1    4
#2:      1    2    5
#3:      1    3    6
#4:      2    7    1
#5:      2    8    2
#6:      2    9    3

数据

DT<-data.frame(partID=c(1,2),Var1=c("1,2,3","7,8,9"),Var2=c("4,5,6","1,2,3"))

答案 2 :(得分:1)

separate_rows()中的tidyr函数是具有多个分隔值的观察的老大......

# create data
library(tidyverse)
d <- data_frame(
  partID = c(1, 2),
  Var1 = c("1,2,3", "7,8,9"),
  Var2 = c("4,5,6","1,2,3")
)
d
# # A tibble: 2 x 3
#   partID  Var1  Var2
#    <dbl> <chr> <chr>
# 1      1 1,2,3 4,5,6
# 2      2 7,8,9 1,2,3

# tidy data
separate_rows(d, Var1, Var2, convert = TRUE)
# # A tibble: 6 x 3
#   partID  Var1  Var2
#    <dbl> <int> <int>
# 1      1     1     4
# 2      1     2     5
# 3      1     3     6
# 4      2     7     1
# 5      2     8     2
# 6      2     9     3

答案 3 :(得分:0)

您还可以使用提供dplyr功能的tidyrunnest来扩展列:

library(dplyr); library(tidyr);
df %>% mutate(Var.1 = strsplit(Var.1, ","), Var.2 = strsplit(Var.2, ",")) %>% unnest()

Source: local data frame [6 x 3]

  partID Var.1 Var.2
   (dbl) (chr) (chr)
1      1     1     4
2      1     2     5
3      1     3     6
4      2     7     1
5      2     8     2
6      2     9     3