【问题标题】:colnames and mutate on multiple dataframescolnames 和 mutate 在多个数据帧上
【发布时间】:2021-03-29 17:38:41
【问题描述】:

我在清理代码时遇到问题。我知道我可以全部输入,但我们显然不希望这样。
我的全球环境中只有数据框。它们都是“data.frame”。 我想检查所有这些的尺寸并将其放在一个小标题中。我设法做到了。我还想将他们的 colnames() 更改为lower(),如果我只输入 data.frame 的名称,这很容易,但有超过 2 个,我希望它自动完成。然后我也想以同样的方式改变所有的data.frames。

我的代码的小例子:

library(tidyverse)
x <- data.frame(letters[1:2]) #To create the data
y <- data.frame(letters[3:4])
dfs <- as.list(ls()) #I take whatever is in my environment

我在下面设法获得了尺寸的小标题:

z <- as_tibble(lapply(seq_along(dfs),
            function(j) dim(get(dfs[[j]]))), .name_repair = "unique")
colnames(z) <- dfs

现在对于存储在我的列表中的所有 data.frames 的 colnames,我基本上想要执行以下代码:

colnames(dfs[[1]]) <- tolower(colnames(dfs[[1]])

但是正如我之前发现的那样,它返回 NULL。所以我在那里使用 get() 使其适用于尺寸。但是如果我使用 get() 来分配 colnames 它说它找不到函数“get 由于所有数据帧的所有 colnames 都是相同的(只是不同的 nrows()),我可以将小写 colnames 保存为值并使用它,但这并不能消除它找不到 get

names <- tolower(colnames(x))
sapply(seq_along(dfs),
       function(j) colnames(get(dfs[[j]])) <- names)
*Error in colnames(get(dfs[[j]])) <- names : 
  could not find function "get<-"*

至于变异部分,我尝试了一个 for 循环:

for(i in seq_along(dfs)){
  get(dfs[[i]]) <- get(dfs[[i]]) %>% mutate(cd = ab)
}

但这是同样的问题。 谁能帮我解决这个问题? (如果有更清晰的维度代码可用,将不胜感激)

我只是想提高我的编码技能。如果我只是把它全部打出来,我早就完成了,但这违背了目的。
谢谢!
-JK

【问题讨论】:

  • @rjen 它确实创建了一个包含 data.frames 名称的列表。不是实际的data.frames 没有。如果需要这样来获得我想要的结果,我必须改变一切对我来说都很好的事情。我只是想避免为 23 个 data.frames 输入相同的内容。

标签: r loops dplyr sapply


【解决方案1】:

使用base R

lapply(dfs, function(x) transform(setNames(x, tolower(names(x))), X = c('a', 'b')))

【讨论】:

    猜你喜欢
    • 2019-11-29
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 2020-06-25
    • 2013-10-18
    • 2017-05-06
    相关资源
    最近更新 更多