R 映射 data.frames 列表并更改列类型
R Map through list of data.frames and change column types
我是 R 的新手,有点绝望,因为我已经研究这个问题很长一段时间了。
我有一个数据帧列表
df1 <- data.frame(na = c("bla", "foo", "bar", "baz"), tmp = c(1,2,5,6), tf = c(2.2, 3.4, 5.6, 7.7))
df2 <- data.frame(na2 = c("blu", "oof", "bar", "baz"), tmp = c(7,8,9,10), tf = c(1.1, 3.3, 2.5, 5.7))
listy <- list(df1, df2)
我想要做的就是将列表中数据帧的每一列更改为字符。
我试过了
listy %>% map(., ~ mutate(.x, across(everything(), as.character(.)))) -> listy2
listy %>% mutate(across(everything(.,), as.numeric())) -> listy2
listy2<- map(listy, ~.x %>% mutate(across(everything(.x), as.numeric(.,))))
但它不起作用。错误在哪里。任何帮助表示赞赏。非常感谢!
你非常接近 - 使用 across
时,你要么传递函数(没有 ()
),要么使用 ~
:[=16= 传递 purrr
样式公式]
library(tidyverse)
df1 <- data.frame(na = c("bla", "foo", "bar", "baz"), tmp = c(1,2,5,6), tf = c(2.2, 3.4, 5.6, 7.7))
df2 <- data.frame(na2 = c("blu", "oof", "bar", "baz"), tmp = c(7,8,9,10), tf = c(1.1, 3.3, 2.5, 5.7))
listy <- list(df1, df2)
listy_2 <- listy %>% map(~ mutate(.x, across(everything(), as.character)))
# or
listy_3 <- listy %>% map(~ mutate(.x, across(everything(), ~as.character(.x))))
listy[[1]]$tmp
#> [1] 1 2 5 6
listy_2[[1]]$tmp
#> [1] "1" "2" "5" "6"
listy_3[[1]]$tmp
#> [1] "1" "2" "5" "6"
由 reprex package (v1.0.0)
于 2021-04-22 创建
虽然问题被标记为 purrr
,但这是一个基本的 R 解决方案。
listy <- Map(function(x) {x[] <- lapply(x, as.character); x}, listy)
str(listy)
#List of 2
# $ :'data.frame': 4 obs. of 3 variables:
# ..$ na : chr [1:4] "bla" "foo" "bar" "baz"
# ..$ tmp: chr [1:4] "1" "2" "5" "6"
# ..$ tf : chr [1:4] "2.2" "3.4" "5.6" "7.7"
# $ :'data.frame': 4 obs. of 3 variables:
# ..$ na2: chr [1:4] "blu" "oof" "bar" "baz"
# ..$ tmp: chr [1:4] "7" "8" "9" "10"
# ..$ tf : chr [1:4] "1.1" "3.3" "2.5" "5.7"
我是 R 的新手,有点绝望,因为我已经研究这个问题很长一段时间了。
我有一个数据帧列表
df1 <- data.frame(na = c("bla", "foo", "bar", "baz"), tmp = c(1,2,5,6), tf = c(2.2, 3.4, 5.6, 7.7))
df2 <- data.frame(na2 = c("blu", "oof", "bar", "baz"), tmp = c(7,8,9,10), tf = c(1.1, 3.3, 2.5, 5.7))
listy <- list(df1, df2)
我想要做的就是将列表中数据帧的每一列更改为字符。 我试过了
listy %>% map(., ~ mutate(.x, across(everything(), as.character(.)))) -> listy2
listy %>% mutate(across(everything(.,), as.numeric())) -> listy2
listy2<- map(listy, ~.x %>% mutate(across(everything(.x), as.numeric(.,))))
但它不起作用。错误在哪里。任何帮助表示赞赏。非常感谢!
你非常接近 - 使用 across
时,你要么传递函数(没有 ()
),要么使用 ~
:[=16= 传递 purrr
样式公式]
library(tidyverse)
df1 <- data.frame(na = c("bla", "foo", "bar", "baz"), tmp = c(1,2,5,6), tf = c(2.2, 3.4, 5.6, 7.7))
df2 <- data.frame(na2 = c("blu", "oof", "bar", "baz"), tmp = c(7,8,9,10), tf = c(1.1, 3.3, 2.5, 5.7))
listy <- list(df1, df2)
listy_2 <- listy %>% map(~ mutate(.x, across(everything(), as.character)))
# or
listy_3 <- listy %>% map(~ mutate(.x, across(everything(), ~as.character(.x))))
listy[[1]]$tmp
#> [1] 1 2 5 6
listy_2[[1]]$tmp
#> [1] "1" "2" "5" "6"
listy_3[[1]]$tmp
#> [1] "1" "2" "5" "6"
由 reprex package (v1.0.0)
于 2021-04-22 创建虽然问题被标记为 purrr
,但这是一个基本的 R 解决方案。
listy <- Map(function(x) {x[] <- lapply(x, as.character); x}, listy)
str(listy)
#List of 2
# $ :'data.frame': 4 obs. of 3 variables:
# ..$ na : chr [1:4] "bla" "foo" "bar" "baz"
# ..$ tmp: chr [1:4] "1" "2" "5" "6"
# ..$ tf : chr [1:4] "2.2" "3.4" "5.6" "7.7"
# $ :'data.frame': 4 obs. of 3 variables:
# ..$ na2: chr [1:4] "blu" "oof" "bar" "baz"
# ..$ tmp: chr [1:4] "7" "8" "9" "10"
# ..$ tf : chr [1:4] "1.1" "3.3" "2.5" "5.7"