将不同数据帧中的重复行名称合并到R中的一个数据帧时保持原样

将不同数据帧中的重复行名称合并到R中的一个数据帧时保持原样,r,dataframe,duplicates,rowname,R,Dataframe,Duplicates,Rowname,我有三个数据帧df1,df2,df3 我把它和df结合起来 期望结果 Answer Freq Yes 10 No 2 Yes 5 No 7 Yes 9 No 3 虽然您可以通过regex删除索引(请参见上面的注释),但您可以通过在rbind之前调用rownames\u to\u列来避免这个问题。purrr::map_df使这样做非常容易,因为它是La

我有三个数据帧df1,df2,df3

我把它和df结合起来

期望结果

   Answer   Freq
      Yes     10
       No      2
      Yes      5
       No      7
      Yes      9
       No      3

虽然您可以通过regex删除索引(请参见上面的注释),但您可以通过在rbind之前调用rownames\u to\u列来避免这个问题。purrr::map_df使这样做非常容易,因为它是Lappy的一个版本,可以将其结果简化为data.frame。因此,

library(tidyverse)    # contains both tibble and purrr

list(df1, df2, df3) %>% map_df(rownames_to_column, 'Answer')

##   Answer Freq
## 1    Yes   10
## 2     No    2
## 3    Yes    5
## 4     No    7
## 5    Yes    9
## 6     No    3
您还可以使用purrr的缩写匿名函数语法:~rownames_to_column.x,'Answer'或更传统的语法:map_dflistdf1、df2、df3、functionx{rownames_to_columnx,'Answer},所有这些语法都做相同的事情

如果你想用R来完成同样的事情

do.call(rbind, lapply(list(df1, df2, df3), function(x){
    x$Answer <- rownames(x); 
    rownames(x) <- NULL; 
    x
}))
如果列表中没有提供名称,.id将获取默认值,即数字字符串。如果愿意,可以进行转换。

我们可以使用data.table进行转换


首先,您是如何获得data.frame df的!?使用唯一的行名会引发错误是的,很抱歉我看到我编辑了questiondata。frames不能有重复的行名。不过,您可以使用正则表达式轻松修复第二个版本:librarytidyverse;df%>%rownames\u to\u column'Answer'>%mutateAnswer=sub'\\d',Answer更好的方法是在您退出之前调用rownames\u to\u column。如果你把你的data.frames放在一个列表中,不管怎样,这都是一个好主意,purrr让这变得非常简单:librarytidyverse;listdf1,df2,df3%>%map_-dfrownames_到_列'Answer'@eipi10您可以使用.id参数,该参数将被传递到绑定_列:listdf1,df2,df3%>%map_-dfrownames_到_列'Answer',.id='df'
   Answer   Freq
      Yes     10
       No      2
      Yes      5
       No      7
      Yes      9
       No      3
library(tidyverse)    # contains both tibble and purrr

list(df1, df2, df3) %>% map_df(rownames_to_column, 'Answer')

##   Answer Freq
## 1    Yes   10
## 2     No    2
## 3    Yes    5
## 4     No    7
## 5    Yes    9
## 6     No    3
do.call(rbind, lapply(list(df1, df2, df3), function(x){
    x$Answer <- rownames(x); 
    rownames(x) <- NULL; 
    x
}))
list(one = df1, two = df2, three = df3) %>% map_df(rownames_to_column, "Answer", .id = "df")

##      df Answer Freq
## 1   one    Yes   10
## 2   one     No    2
## 3   two    Yes    5
## 4   two     No    7
## 5 three    Yes    9
## 6 three     No    3
library(data.table)
rbindlist(lapply(mget(paste0("df", 1:3)),
        function(x) transform(x, Answer = row.names(x))[2:1]))
#   Answer Freq
#1:    Yes   10
#2:     No    2
#3:    Yes    5
#4:     No    7
#5:    Yes    9
#6:     No    3