r - 在 R 中将行拆分为列

标签 r reshape melt

我有一个这样的文本数据文件(各个类别 [A,B,C] 有多行):

A=1,2,3,6,
7,9
10
B=3,4,5
C=5,7,8,10,11,
13,14

当我加载到 R 时,它变成了一个有 6 个 obs 的数据框。和 1 个变量
df <- read.delim("file.text",header = FALSE)

    v1
1   A=1,2,3,6,
2   7,9
3   10
4   B=3,4,5
5   C=5,7,8,10,11,
6   13,14

如何更改为这种格式?
   A  B  C
1  A
2  A
3  A  B
4     B
5     B  C
6  A
7  A     C
8        C
9  A
10 A     C
11       C
13       C
14       C

谢谢!

最佳答案

基本方法是将数据作为字符串读取,在 = 上拆分。和 , ,然后找出识别每个数字属于哪个组的最佳方法。

在以下方法中,我有意使用类型转换来创建组。由于这将涉及从字符到数字的强制转换,因为拆分值中有字符,所以会出现一些警告消息。

# Load the data.table package.
library(data.table)

# Read in the data.
x <- fread("A=1,2,3,6,
7,9
10
B=3,4,5
C=5,7,8,10,11,
13,14", sep = "\n", header = FALSE)

x[, unlist(strsplit(V1, "=|,"), use.names = FALSE, recursive = FALSE), .I][
  , list(ind = as.integer(V1), col = rep(V1[1], .N)), cumsum(is.na(as.integer(V1)))][
    , dcast(na.omit(.SD), ind ~ col, value.var = "col", fill = "")]
#     ind A B C
#  1:   1 A    
#  2:   2 A    
#  3:   3 A B  
#  4:   4   B  
#  5:   5   B C
#  6:   6 A    
#  7:   7 A   C
#  8:   8     C
#  9:   9 A    
# 10:  10 A   C
# 11:  11     C
# 12:  13     C
# 13:  14     C

这是使用 cSplit 的另一种选择来自我的“splitstackshape”包。 “x”是使用 fread 读取的相同数据.
library(splitstackshape)
cSplit(
  cSplit(x[, toString(V1), cumsum(grepl("[A-Z]", V1))], "V1", "="), "V1_2", ",", "long")[
    , dcast(.SD, V1_2 ~ V1_1, value.var = "V1_1", fill = "")]

关于r - 在 R 中将行拆分为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59133299/

相关文章:

c - 在预先存在的 R 包中模仿 C 的用法

string - 从字符串加载R包

python - Pandas 熔化函数使用列索引位置而不是列名称

python - 如何转换数据框以便列值是行值

使用 dcast reshape 数据?

r - 使用 reshape2 熔化两组列从宽到长

r - 无法在 R Shiny flexdashboard 中并排绘制条形图

将 NA 替换为基于行条件的值

r - 使用 reshape 查找配对事件

MATLAB: reshape 3D 矩阵的每个切片