gpt4 book ai didi

r - Purrr - 有条件地改变数据框列表中的列

转载 作者:行者123 更新时间:2023-12-05 01:14:24 26 4
gpt4 key购买 nike

考虑以下数据框列表:

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))

如果不是这样,我想将 AB 的元素连接到 B 列中。请注意,并非所有数据框都有 B 列。

这样做的条件如下:

  1. 数据框必须同时具有 AB
  2. B的首字母必须与A
  3. 的首字母不同

我正在使用 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 列应该被重写。 df2df3df4 应保持不变。
预期的输出是:

$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是否在列名中,如果是则检查第一个元素(str_sub(B, 1, 1))是否与A不匹配,如果是则合并甲和乙

@Moody_Mudskipper 建议使用 map_if

df_ls %>% 
map_if(~ all(c("A", "B") %in% colnames(.x)),
~ mutate(.x, B = if_else(str_sub(B, 1, 1) != A, paste(A, B), B)))

更详细:

df_ls %>% 
map(~ {if (all(c("A", "B") %in% colnames(.x))) {
.x %>%
mutate(B = if_else(str_sub(B, 1, 1) != A, paste(A, B), B))
} else {
.x
}})

# $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

关于r - Purrr - 有条件地改变数据框列表中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58642979/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com