【问题标题】:Converting a list to multiple data frames, to be able to convert only a column of each data frame to numeric data将列表转换为多个数据框,以便能够仅将每个数据框的一列转换为数值数据
【发布时间】:2014-10-18 21:10:31
【问题描述】:

我是 R 编程的新手,我已经有好几天遇到这个问题了。我从拆分文件创建的列表开始。该列表包含大量数据框。我能够在其中执行一些操作,例如将一些数据替换为NAlapply。但是现在,我被卡住了,不知道如何在这个巨大的列表中只转换这个数据框的一列。

这是我文件中的一个示例:

d1 <- data.frame(foo = c("a", "b", "c", "d", "e"), bar = as.character(c(4.27, 5.68, 5.52, 5.20, 3.67)))
d2 <- data.frame(bla = c("a", "e", "c"), blu = as.character(c(10.14, 9.88, 10.01)))
d3 <- data.frame(lol = c("p", "s", "q", "r"), pum = as.character(c(5.96, 1.22, -1.61, 5.05)))
d1[, 2] <- as.character(d1[, 2])
d2[, 2] <- as.character(d2[, 2])
d3[, 2] <- as.character(d3[, 2])
file <- list(d1, d2, d3)

这会产生这样的结果:

[[1]]
 foo  bar
1   a 4.27
2   b 5.68
3   c 5.52
4   d  5.2
5   e 3.67

[[2]]
 bla   blu
1   a 10.14
2   e  9.88
3   c 10.01

[[3]]
 lol   pum
1   p  5.96
2   s  1.22
3   q -1.61
4   r  5.05

我想要这样的结果:

[[1]]
 foo  bar
5   e 3.67
1   a 4.27
4   d  5.2
3   c 5.52
2   b 5.68

[[2]]
 bla   blu
2   e  9.88
3   c 10.01
1   a 10.14

[[3]]
 lol   pum
3   q -1.61
2   s  1.22
4   r  5.05
1   p  5.96

订购后,我将不得不在每个数据帧上提取特定的行,但我想如果我了解如何执行此操作,我可能能够做到这一点。

经过大量尝试,并在这里找到了一个线程,我终于能够做到这一点:

for(i in 1:length(names(file))){
    assign(paste("df", i, sep = ""), file[[i]])
    }

这段代码让我分离了使用split 函数后得到的数据帧。现在我想在这个for 循环中添加一种将我在一列中的字符数据重新转换为数字数据的方法。我曾尝试在for 循环中使用这样的代码:

df[, 2] <- sapply(df[,2], as.numeric)

但我得到一个错误:'Closure' 类型对象不是子集。

有人可以帮忙吗?如果有人能告诉我一个更简单的替代方案(如果有的话),那将是非常受欢迎的。

【问题讨论】:

    标签: r list loops dataframe


    【解决方案1】:

    我想你想要

    lapply(file, function(x) {
        x[[2]] <- as.numeric(x[[2]])        
        x[order(x[[2]]), ]
    })
    

    解释:

    • lapply 在列表上迭代函数
    • file 是您的名单,我们正在处理的名单
    • function(x) 是一个“匿名”函数,其中x 将是file 的每个单独元素
    • x[[2]] &lt;- as.numeric(x[[2]]) 将第二列转换为数字
    • x[order(x[[2]]), ] 按第二列对数据框的行进行排序。

    【讨论】:

    • 我先试一试,如果你想验证,我用非随机数据更改了 rnorm。您介意解释一下您的代码的作用,以便我更好地理解吗?
    • 好的,我加了解释
    • 谢谢!我需要更改您的代码,因为在将列更改为数字之前它是排序的,但现在我明白了!
    猜你喜欢
    • 2022-08-13
    • 2020-04-15
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    相关资源
    最近更新 更多