在将其组合到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 【问题描述】:我有三个数据框df1
、df2
、df3
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.framedf
首先!?拥有唯一的行名会引发错误
是的,抱歉,我看到我已经编辑了问题
data.frames 不能有重复的行名。不过,您可以使用正则表达式轻松修复第二个版本:library(tidyverse); df %>% rownames_to_column('Answer') %>% mutate(Answer = sub('\\d', '', Answer))
更好的方法是在rbind
之前致电rowname_to_column
。如果您将 data.frames 放在一个列表中(无论如何都是个好主意),purrr 让这变得非常简单:library(tidyverse); list(df1, df2, df3) %>% map_df(rownames_to_column, 'Answer')
@eipi10 您可以使用.id
参数,该参数将被传递给bind_cols
:list(df1, df2, df3) %>% 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 参数?
如何将简单的 data.frame 附加到 R 中的 SpatialPolygonDataFrame?