我当前的数据集有很多变量,每个都看起来像
year place1 place2
1999 1.1 7.8
...
我希望每个变量都按年融化。我想知道为什么以下代码不起作用。
# define function
my.melt <- function(x){
x <- melt(x, id.vars=c('year'),
variable.name='place')
}
然后我用我的函数遍历我的变量:
# loop through
var.names=list(var1, var2)
for (i in 1:length(var.names)){
var.names[i] <- my.melt(var.names[i])
}
使用此循环,不会更改任何内容。但是,当我尝试
时var1 <- my.melt(var1)
它有效,我的var1
被重新塑造。所以我认为我的功能还可以。为什么循环不起作用?
注意:我也试过lapply
;它也没有像我预期的那样工作。
非常感谢你。
答案 0 :(得分:0)
在循环中更改的一件事是将[
更改为[[
,并且my.melt
应该返回&#39; x&#39;
my.melt <- function(x){
x <- melt(x, id.vars=c('year'),
variable.name='place')
x
}
var.names=list(var1, var2)
for (i in 1:length(var.names)){
var.names[[i]] <- my.melt(var.names[[i]])
}
但是,这也可以通过lapply
list2env(setNames(lapply(var.names, my.melt), paste0("var", 1:2)), envir = .GlobalEnv)
var1 <- structure(list(year = 1999:2000, place1 = c(1.1, 1.5), place2 = c(7.8,
7.3)), .Names = c("year", "place1", "place2"), class = "data.frame",
row.names = c(NA, -2L))
var2 <- structure(list(year = 1999:2000, place1 = c(1.1, 1.7), place2 = c(8.3,
7.3)), .Names = c("year", "place1", "place2"),
row.names = c(NA, -2L), class = "data.frame")
答案 1 :(得分:0)
关于我的最新评论,
# loop through
reshape <- lapply(var.names, my.melt)
现在,我cbind()
我的所有数据:
datalist = list() # create empty list
for (i in 1:100) {
datalist[[i]] <- reshape[[i]]
}
merge <- do.call(cbind, datalist)
merge <- subset(merge, select = c(seq(3, 300, by = 3)))
names(merge) <- c(var.names)
绝对不是最聪明的方式 - 但它确实有效。