在将其组合到R中的一个数据帧时,在不同的数据帧中保留重复的行名[重复]

Posted

技术标签:

【中文标题】在将其组合到R中的一个数据帧时,在不同的数据帧中保留重复的行名[重复]【英文标题】:Keep Duplicate row names in different dataframes as it is when combining it to one data frame in R [duplicate] 【发布时间】:2017-05-28 10:24:00 【问题描述】:

我有三个数据框df1df2df3

df1
     Freq
Yes    10
No      2

df2 
     Freq
Yes     5
No      7

df2 
     Freq
Yes     5
No      7

我把它合并到df

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 作为列名。

 library(tibble)
 df <- rownames_to_column(df,"Answer")

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

想要的结果

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

【问题讨论】:

你怎么能拥有data.frame df 首先!?拥有唯一的行名会引发错误 是的,抱歉,我看到我已经编辑了问题 data.frames 不能有重复的行名。不过,您可以使用正则表达式轻松修复第二个版本:library(tidyverse); df %&gt;% rownames_to_column('Answer') %&gt;% mutate(Answer = sub('\\d', '', Answer)) 更好的方法是在rbind 之前致电rowname_to_column。如果您将 data.frames 放在一个列表中(无论如何都是个好主意),purrr 让这变得非常简单:library(tidyverse); list(df1, df2, df3) %&gt;% map_df(rownames_to_column, 'Answer') @eipi10 您可以使用.id 参数,该参数将被传递给bind_colslist(df1, df2, df3) %&gt;% map_df(rownames_to_column, 'Answer', .id = 'df') 【参考方案1】:

虽然您可以通过正则表达式删除索引(请参阅上面的 cmets),但您可以通过在 rbind 之前调用 rownames_to_column 来避免此问题。 purrr::map_df 使这样做非常容易,因为它是 lapply 的一个版本,将其结果简化为 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_df(list(df1, df2, df3), function(x)rownames_to_column(x, 'Answer')),所有这些都做同样的事情。

如果您想仅使用基本 R 来完成同样的事情,

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:

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 将获取默认值,即数字字符串。喜欢就转换吧。

【讨论】:

【参考方案2】:

我们可以通过data.table 做到这一点

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

【讨论】:

以上是关于在将其组合到R中的一个数据帧时,在不同的数据帧中保留重复的行名[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中合并多个数据帧时如何使用 suffixes 参数?

r - 合并数据帧时保留索引

如何将简单的 data.frame 附加到 R 中的 SpatialPolygonDataFrame?

如何在使用转义或引号在pyspark中的文件中写入数据帧时获得完全匹配? [复制]

切片 1 行 pandas 数据帧时,切片变为系列

在遍历 dict_values 或列表中的数据帧时访问下一个 df ("v+1")