我在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循环,我怎样才能实现呢?
答案 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