我是R的编程新手,我已经有好几天了。我从分割文件创建的列表开始。此列表包含大量数据框。我能够在其中执行一些操作,例如将某些数据替换为NA
lapply
。但是现在,我陷入困境,不知道如何在这个巨大的列表中只转换这一数据框的一列。
这是我文件中的例子:
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'类型对象不是子集。
任何人都可以提供帮助?如果有人能告诉我一个更简单的替代方案(如果有的话),那将非常受欢迎。
答案 0 :(得分:2)
我想你想要
lapply(file, function(x) {
x[[2]] <- as.numeric(x[[2]])
x[order(x[[2]]), ]
})
说明:
lapply
在列表上迭代函数file
是您的列表,我们正在使用的列表function(x)
是一个“匿名”函数,其中x
将是file
的每个元素x[[2]] <- as.numeric(x[[2]])
将第二列转换为数字x[order(x[[2]]), ]
按第二列排序数据框的行。