我想使用辅助列的第一个值,它在每一行中包含相同的字符串,作为具有实际值的列的列名。 dfs 存储在列表中。有没有办法用
purrr
来处理这个问题? (我试过但没有找到解决办法)
例子:
# Create dataframe
df1 = data.frame(
A = c(1, 2, 3),
B = c("df1", "df1", "df1")
)
# Create another dataframe
df2 = data.frame(
A = c(4, 5, 6),
B = c("df2", "df2", "df2")
)
# Create list of data frames
list1 = list(df1, df2)
这就是我希望 dfs 在列表中的样子:
[[1]]
df1
1 1
2 2
3 3
[[2]]
df2
1 4
2 5
3 6
我真的很感激任何想法和解决方案,谢谢!!
我尝试采摘包含字符串的第一个值,但我想不出一个解决方案可以让我将这些值作为新列名映射到列表中。
我们可以使用
tibble::lst
创建 data.frame
的命名列表,然后使用 map
取消选择 B
列:
library(tibble)
library(dplyr)
library(purrr)
list1 = lst(df1, df2)
list1 %>%
map(~ select(.x, !B))
#> $df1
#> A
#> 1 1
#> 2 2
#> 3 3
#>
#> $df2
#> A
#> 1 4
#> 2 5
#> 3 6
来自 OP 的数据
# Create dataframe
df1 = data.frame(
A = c(1, 2, 3),
B = c("df1", "df1", "df1")
)
# Create another dataframe
df2 = data.frame(
A = c(4, 5, 6),
B = c("df2", "df2", "df2")
)
由 reprex 包 (v2.0.1) 于 2023-02-21 创建
如果可能的话,我会选择 Tim 的解决方案,但是,如果您的数据框的名称与 B 列的名称不同,您可以这样做
first_data = data.frame(
A = c(1, 2, 3),
B = c("df1", "df1", "df1")
)
# Create another dataframe
second_data = data.frame(
A = c(4, 5, 6),
B = c("df2", "df2", "df2")
)
library(purrr)
library(dplyr)
list(first_data,second_data) |>
set_names(c((first_data$B[1]), second_data$B[1])) |>
map(~.x |> select(-B))
$df1
A
1 1
2 2
3 3
$df2
A
1 4
2 5
3 6