在R中如何使用重复列名的数据框生成另一个数据框

3

如何通过相同的列名改变下面的数据框:

 A.Number A.Name B.Number B.Name A.Number A.Name B.Number B.Name C.D.Age 
1      123   Test      456  Test1      789  Test2   101112  Test3     101

To:

 A.Number A.Name B.Number B.Name C.D.Age 
1      123   Test      456  Test1     NA 
2      789  Test2   101112  Test3     101

编辑:我从一个名为dataList的列表中获得了数据框,如果我运行dput(dataList),我会得到...

list(list(A = list(Number = list("123"), Name = list("Test")), 
    B = list(Number = list("456"), Name = list("Test1"))), list(
    A = list(Number = list("789"), Name = list("Test2")), B = list(
        Number = list("101112"), Name = list("Test3")), C = list(
        D = list(Age = list("101")))))

那么我该如何转换为上述输出?

请确保您的示例可重现(即提供可以粘贴到R中以重新创建您的数据框的代码)。 - s_baldur
3个回答

1
使用 purrr::map_df -
res <- purrr::map_df(dataList, ~as.data.frame(t(unlist(.x))))
res

#  A.Number A.Name B.Number B.Name C.D.Age
#1      123   Test      456  Test1    <NA>
#2      789  Test2   101112  Test3     101

所以我从名为dataList的列表中获取了数据框,如果我使用unlist(dataList),我得到了A.Number A.Name B.Number B.Name "123" "Test" "456" "Test1" A.Number A.Name B.Number B.Name C.D.Age "789" "Test2" "101112" "Test3" "101" ...那么我该如何使用你的代码来处理这个问题? - dev123
谢谢Sha,但是C.D.Age = 101属于rownum = 2。你可以在列表中看到这一点。我该如何在你的函数中更改它? - dev123
1
@dev123 好的,我已经相应地更新了答案。 - Ronak Shah

1
  1. 我们可以通过列索引将 df 分成 df1df2
  2. 使用 bind_rows
  3. 注意 C.D.Age 在两行中都保留了。
df1 <- df[,c(1:4,9)]
df2 <- df[,5:9]

library(dplyr)
bind_rows(df1,df2)

输出:

  A.Number A.Name B.Number B.Name C.D.Age
1:      123   Test      456  Test1     101
2:      789  Test2   101112  Test3     101

1
lst <- list(list(A = list(Number = list("123"), Name = list("Test")), 
                 B = list(Number = list("456"), Name = list("Test1"))), list(
                   A = list(Number = list("789"), Name = list("Test2")), B = list(
                     Number = list("101112"), Name = list("Test3")), C = list(
                       D = list(Age = list("101")))))

library(dplyr)

purrr::map_df(lst, ~ .x %>% unlist %>% t %>% as.data.frame)

#>   A.Number A.Name B.Number B.Name C.D.Age
#> 1      123   Test      456  Test1    <NA>
#> 2      789  Test2   101112  Test3     101

本文创建于2021年5月28日,使用reprex package (v2.0.0)。

这两者也可以实现同样的功能。不幸的是base::rbind无法处理缺失行,因此建议使用dplyr::bind_rows

do.call(bind_rows, Map(function(x) as.data.frame(t(unlist(x))), lst))

Reduce(bind_rows, Map(function(x) as.data.frame(t(unlist(x))), lst))

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