【发布时间】:2019-10-31 12:03:50
【问题描述】:
考虑以下数据框列表:
library(tidyverse)
df1 <- tibble(
id = 1:5,
A = LETTERS[1:5],
B = letters[10:14]
)
df2 <- tibble(
id = 1:3,
A = LETTERS[1:3],
B = paste(LETTERS[1:3], letters[10:12])
)
df3 <- tibble(
id = 1:6,
B = paste(LETTERS[1:6], letters[10:15])
)
df4 <- tibble(
id = 1:4,
C = paste(LETTERS[15:18], letters[20:23])
)
df_ls <- list(df1, df2, df3, df4) %>%
set_names(paste0("df", 1:4))
我想将A 和B 的元素连接到B 列中(如果还没有的话)。请注意,并非所有数据框都有B 列。
这样做的条件如下:
- 数据框必须同时具有
A和B列 -
B的首字母必须与A的首字母不同
我正在使用map 函数。到目前为止我的尝试(没有“条件 2”):
df_ls %>%
map(
~ .x %>%
mutate_at(
vars(matches("B")),
~ {
if (c("A", "B") %in% colnames(.) %>% sum() == 2)
paste(A, B)
else
B
}
)
)
它不起作用。
另外,我没有设法写出我的第二个条件。我试过& setequal(. %>% pull(A), . %>% pull(B) %>% word(1)),没有成功。
编辑:
我需要单独保存所有数据框。只有df1 中的B 列应该被重写。 df2、df3 和 df4 应保持不变。
预期的输出是:
$df1
# A tibble: 5 x 3
id A B
<int> <chr> <chr>
1 1 A A j
2 2 B B k
3 3 C C l
4 4 D D m
5 5 E E n
$df2
# A tibble: 3 x 3
id A B
<int> <chr> <chr>
1 1 A A j
2 2 B B k
3 3 C C l
$df3
# A tibble: 6 x 2
id B
<int> <chr>
1 1 A j
2 2 B k
3 3 C l
4 4 D m
5 5 E n
6 6 F o
$df4
# A tibble: 4 x 2
id C
<int> <chr>
1 1 O t
2 2 P u
3 3 Q v
4 4 R w
【问题讨论】:
-
您的预期输出是什么?当你说你想(有条件地)连接列 A 和 B 时,我不确定你想要什么。
-
我在问题中添加了预期的输出。