循环通过变量在R中融化

时间:2016-08-18 08:09:52

标签: r function for-loop melt

我当前的数据集有很多变量,每个都看起来像

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;它也没有像我预期的那样工作。

非常感谢你。

2 个答案:

答案 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)

绝对不是最聪明的方式 - 但它确实有效。