将lapply输出保存为数据帧循环

时间:2014-06-23 12:50:04

标签: r for-loop dataframe apply lapply

我在R中有以下数据:

dat <- read.table(text="
city var value
a   var1    0.19
b   var1    0.67
c   var1    0.19
a   var2    0.14
b   var2    0.38
c   var2    0.27
a   var3    0.59
b   var3    0.42
c   var3    0.27
a   var4    0.28
b   var4    0.37
c   var4    0.91
", header=TRUE)

我需要与其他城市创建城市b的不同数据框架(例如城市b与城市a,城市b与城市c等)。 Andrie设法通过lapply功能获得了这个功能。

lapply(
  setdiff(levels(dat$city), "b"),
  function(i){
    ret <- dat[dat$city %in% c("b", i), ]
    ret[order(ret$var, ret$city), ]
  })

然后我得到了我需要的输出,但我不知道如何将每个[[i]]保存为不同的数据帧。例如。 [[1]]将是citybcitya,[[2]]将是citybcityc等。

[[1]]
   city  var value
2     b var1  0.67
1     a var1  0.19
5     b var2  0.38
4     a var2  0.14
8     b var3  0.42
7     a var3  0.59
11    b var4  0.37
10    a var4  0.28

[[2]]
   city  var value
2     b var1  0.67
3     c var1  0.19
5     b var2  0.38
6     c var2  0.27
8     b var3  0.42
9     c var3  0.27
11    b var4  0.37
12    c var4  0.91

如果没有for循环,我怎样才能实现呢?

1 个答案:

答案 0 :(得分:5)

使用list2env,您需要先保存lapply个结果,然后为列表对象指定名称:

temp <- lapply(
  setdiff(levels(dat$city), "b"),
  function(i){
    ret <- dat[dat$city %in% c("b", i), ]
    ret[order(ret$var, ret$city), ]
  })

names(temp) <- c("citybcitya", "citybcityc")
list2env(temp, envir = .GlobalEnv)

citybcitya
#    city  var value
# 1     a var1  0.19
# 2     b var1  0.67
# 4     a var2  0.14
# 5     b var2  0.38
# 7     a var3  0.59
# 8     b var3  0.42
# 10    a var4  0.28
# 11    b var4  0.37

citybcityc
# city  var value
# 2     b var1  0.67
# 3     c var1  0.19
# 5     b var2  0.38
# 6     c var2  0.27
# 8     b var3  0.42
# 9     c var3  0.27
# 11    b var4  0.37
# 12    c var4  0.91