我有三个数据帧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
发布于 2017-01-13 16:15:08
虽然您可以通过正则表达式删除索引(参见上面的注释),但是您可以在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
将获取默认值,即数字字符串。如果您愿意,可以进行转换。
发布于 2017-01-16 04:29:36
我们可以使用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
https://stackoverflow.com/questions/41627967
复制相似问题