合并(与拆分相反)r 中的行对

Posted

技术标签:

【中文标题】合并(与拆分相反)r 中的行对【英文标题】:merge (opposite of split) pair of rows in r 【发布时间】:2012-07-26 14:05:55 【问题描述】:

我有如下的专栏。每列有两对,每对都有后缀“a”和“b”——例如 col1a、col1b、colNa、colNb 等,直到文件结束 (> 50000)。

mydataf <- data.frame (Ind = 1:5, col1a = sample (c(1:3), 5, replace = T), 
   col1b = sample (c(1:3), 5, replace = T),  colNa = sample (c(1:3), 5, replace = T),
   colNb = sample (c(1:3),5, replace = T),
     K_a = sample (c("A", "B"),5, replace = T),  
    K_b = sample (c("A", "B"),5, replace = T))

mydataf 
   Ind col1a col1b colNa colNb K_a K_b
1   1     1     1     2     3   B   A
2   2     1     3     2     2   B   B
3   3     2     1     1     1   B   B
4   4     3     1     1     3   A   B
5   5     1     1     3     2   B   A

除了第一列(Ind),我想折叠这对行以使数据框如下所示,同时删除后缀“a”和“b”。还合并的字符或数字按 1 后 2 排序,A 在 B 前

   Ind col1   colN  K_
    1   11     23   AB   
    2   13     22   BB
    3   12     11   BB
    4   13     13   AB
    5   11     23   AB   

编辑:如果列的名称相似,答案中的 grep 函数(可能)有问题。

mydataf <- data.frame (col_1_a = sample (c(1:3), 5, replace = T),
   col_1_b = sample (c(1:3), 5, replace = T),  col_1_Na = sample (c(1:3), 5, replace = T),
   col_1_Nb = sample (c(1:3),5, replace = T),
     K_a = sample (c("A", "B"),5, replace = T),
    K_b = sample (c("A", "B"),5, replace = T))
n <- names(mydataf)
nm <- c(unique(substr(n, 1, nchar(n)-1)))
df <- data.frame(sapply(nm, function(x)
                             idx <- grep(x, n)
                             cols <- mydataf[idx]
                             x <- apply(cols, 1,
                                       function(z) paste(sort(z), collapse = ""))
                             return(x)
                            ))
names(df) <- nm
df

 col_1_ col_1_N K_
1   2233      23 BB
2   2233      22 BB
3   1123      13 AB
4   1223      12 AB
5   2333      33 AB

【问题讨论】:

【参考方案1】:
mydataf
  Ind col1a col1b colNa colNb K_a K_b
1   1     2     1     1     1   A   A
2   2     1     2     1     3   B   A
3   3     1     2     3     2   A   A
4   4     1     2     3     1   A   B
5   5     1     2     2     1   A   A
n <- names(mydataf)
nm <- c("Ind", unique(substr(n, 1, nchar(n)-1)[-1]))
df <- data.frame(sapply(nm, function(x)
                             idx <- grep(paste0(x, "[ab]?$"), n)
                             cols <- mydataf[idx]
                             x <- apply(cols, 1, 
                                       function(z) paste(sort(z), collapse = ""))
                             return(x)
                            ))
names(df) <- nm
df
  Ind col1 colN K_
1   1   12   11 AA
2   2   12   13 AB
3   3   12   23 AA
4   4   12   13 AB
5   5   12   12 AA

【讨论】:

感谢您的解决方案,但是如果变量名称相似,则函数看起来有问题,请参阅最近的编辑.. @sharnil,我在grep 中将x 替换为paste0(x, "[ab]?$")。现在它将要求列名以 a 或 b 结尾,或者都不以它们结尾(对于 Ind 情况)。如果没有Ind 列,您可以删除?

以上是关于合并(与拆分相反)r 中的行对的主要内容,如果未能解决你的问题,请参考以下文章

如何使用来自底层绑定源的行对 datagridview 行执行样式更改?

如何聚合数据框并通过 r 中的重复行对列的值求和

根据包含数字和不包含数字的行对 CSV 中的行进行排序

SQL - 按行对排序

R语言 数据重塑

使用tidyr将字符串长度不均匀的行拆分为R中的列[重复]