【问题标题】:R Map through list of data.frames and change column typesR通过data.frames列表映射并更改列类型
【发布时间】:2021-04-22 14:24:10
【问题描述】:

我对 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 %&gt;% map(., ~ mutate(.x, across(everything(), as.character(.)))) -&gt; listy2

listy %&gt;% mutate(across(everything(.,), as.numeric())) -&gt; listy2 listy2&lt;- map(listy, ~.x %&gt;% mutate(across(everything(.x), as.numeric(.,))))

但它不起作用。错误在哪里。任何帮助表示赞赏。提前非常感谢!

【问题讨论】:

    标签: r list dictionary purrr


    【解决方案1】:

    您非常接近 - 使用 across 时,您可以通过函数(不带 ())或使用 ~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 年 4 月 22 日创建

    【讨论】:

    • 非常感谢!这是另一个问题:有时我会看到“.x”、“.”或“.data”。它们之间有什么区别?
    【解决方案2】:

    虽然问题被标记为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"
    

    【讨论】:

    • 哦,太好了。谢谢。你能向我解释一下代码吗?就像为什么有一个“;”最后是“...},listy”?干杯
    猜你喜欢
    • 2016-07-11
    • 2023-03-10
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    相关资源
    最近更新 更多