【发布时间】:2020-10-16 11:00:34
【问题描述】:
我将此 Excel 工作表作为数据框列表导入。我想将列表合并到一个数据框中。 bind_rows() 让我可以轻松地将数据帧相加,但问题是我有一个变量/列在每个数据帧中具有不同的名称。 bind_row() 默认情况下会创建两个单独的列,其他数据帧中的数据为空值。如何加入这些专栏?
示例代码:
# Sample dataframes
df1 <- tibble(A = c(1,2,3),
B = c("X","Y","Z"),
C = c(T,F,F)
)
df2 <- tibble(A = c(3,4,5),
B = c("U","V","W"),
D = c(T,T,F)
)
# List of dataframes
my_ls <- list(df1, df2)
my_ls
[[1]]
# A tibble: 3 x 3
A B C
<dbl> <chr> <lgl>
1 1 X TRUE
2 2 Y FALSE
3 3 Z FALSE
[[2]]
# A tibble: 3 x 3
A B D
<dbl> <chr> <lgl>
1 3 U TRUE
2 4 V TRUE
3 5 W FALSE
# Creating joined dataframe:
my_df <- bind_rows(my_ls)
my_df
# Current outcome: A tibble: 6 x 4
A B C D
<dbl> <chr> <lgl> <lgl>
1 1 X TRUE NA
2 2 Y FALSE NA
3 3 Z FALSE NA
4 3 U NA TRUE
5 4 V NA TRUE
6 5 W NA FALSE
期望的结果:
# Desired outcome: A tibble: 6 x 3
A B C
<dbl> <chr> <lgl>
1 1 X TRUE
2 2 Y FALSE
3 3 Z FALSE
4 3 U TRUE
5 4 V TRUE
6 5 W FALSE
目前,我一直在使用mutate() 和case_when(),我检查哪一列不为空(!is.na())。这行得通,但我不禁认为一定有更简单的方法。
# Example using mutate
my_df <- my_df %>%
mutate(
C = case_when(is.na(C) & !is.na(D) ~ D,
!is.na(C) & is.na(D) ~ C,
# The lines below may be a bit redundant for my purpose, since the dataframes either have the C or D variable.
!is.na(C) & !is.na(D) ~ C, # Better would be to return that variable has overlapping information
is.na(C) & is.na(D) ~ NA
)
) %>%
select(-D)
my_df
# A tibble: 6 x 3
A B C
<dbl> <chr> <lgl>
1 1 X TRUE
2 2 Y FALSE
3 3 Z FALSE
4 3 U TRUE
5 4 V TRUE
6 5 W FALSE
【问题讨论】:
-
这不行吗? names(df2) = names(df1) df1 %>% bind_rows(df2) 即更改第二个数据帧的列名然后绑定行?
-
可能是。这将要求数据框的名称以相同的顺序出现,不是吗?我也许应该更好地澄清这一点。实际上,我有多个数据帧,具有变量 C 或 D,并且不一定顺序相同。