将不同数据帧中的重复行名称合并到R中的一个数据帧时保持原样
我有三个数据帧df1,df2,df3 我把它和df结合起来 期望结果将不同数据帧中的重复行名称合并到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
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