首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将不同数据帧中的重复行名称合并到R中的一个数据帧时保持不变

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

Stack Overflow用户
提问于 2017-01-13 13:34:13
回答 2查看 2.8K关注 0票数 0

我有三个数据帧df1df2df3

代码语言:javascript
代码运行次数:0
运行
复制
df1
     Freq
Yes    10
No      2

df2 
     Freq
Yes     5
No      7

df2 
     Freq
Yes     5
No      7

我把它合并到了df

代码语言:javascript
代码运行次数:0
运行
复制
df1 <- data.frame(Freq= c(10,2))
df2 <- data.frame(Freq= c(5,7))
df3 <- data.frame(Freq= c(9,3))
rownames(df1) <- c("Yes","No")
rownames(df2) <- c("Yes","No")
rownames(df3) <- c("Yes","No")

df <- data.frame(rbind(df1,df2,df3))
df
       Freq
Yes      10
No        2
Yes1      5
No1       7
Yes2      9
No2       3

现在,如果您看到df,每当它发现重复的行名时,它就会在它旁边粘贴一个索引。

如何删除重复名称的索引,并将其保留在第一位?然后,我将rownames(df)更改为df中的第一列,列名为Answer

代码语言:javascript
代码运行次数:0
运行
复制
 library(tibble)
 df <- rownames_to_column(df,"Answer")

   Answer   Freq
      Yes     10
       No      2
     Yes1      5
      No1      7
     Yes2      9
      No2      3

期望的结果

代码语言:javascript
代码运行次数:0
运行
复制
   Answer   Freq
      Yes     10
       No      2
      Yes      5
       No      7
      Yes      9
       No      3
EN

回答 2

Stack Overflow用户

发布于 2017-01-14 00:15:08

虽然您可以通过正则表达式删除索引(参见上面的注释),但是您可以在rbind之前调用rownames_to_column来避免这个问题。purrr::map_df非常容易做到这一点,因为它是lapply的一个版本,它将结果简化为一个data.frame。因此,

代码语言:javascript
代码运行次数:0
运行
复制
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_df(list(df1, df2, df3), function(x){rownames_to_column(x, 'Answer')}),所有这些语法都做同样的事情。

如果你想用R做同样的事情,

代码语言:javascript
代码运行次数:0
运行
复制
do.call(rbind, lapply(list(df1, df2, df3), function(x){
    x$Answer <- rownames(x); 
    rownames(x) <- NULL; 
    x
}))

返回相同的内容。

如果您想要添加一个标识符列,其中的行来自哪个data.frame,则向map_df.id参数(其工作方式类似于dplyr::bind_rows中的参数)传递此类列的名称,就像rownames_to_column一样

代码语言:javascript
代码运行次数:0
运行
复制
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

如果您没有在列表中提供名称,.id将获取默认值,即数字字符串。如果您愿意,可以进行转换。

票数 1
EN

Stack Overflow用户

发布于 2017-01-16 12:29:36

我们可以使用data.table做到这一点

代码语言:javascript
代码运行次数:0
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41627967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档