使用for循环分解数据帧
我有一个类似的数据集:使用for循环分解数据帧,r,loops,for-loop,dataframe,R,Loops,For Loop,Dataframe,我有一个类似的数据集: 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 va
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
我需要创建城市b与其他城市的不同数据帧(例如,城市b与城市a、城市b与城市c等)。对于我稍后所做的一些代数运算,城市b在所有变量中首先出现是非常重要的
示例城市b和城市a:
city var value
b var1 0.67
a var1 0.19
b var2 0.38
a var2 0.14
b var3 0.42
a var3 0.59
b var4 0.37
a var4 0.28
示例城市b和城市c:
city var value
b var1 0.67
c var1 0.19
b var2 0.38
c var2 0.27
b var3 0.42
c var3 0.27
b var4 0.37
c var4 0.91
我尝试了以下(我的第一个循环之一),但没有成功:
for (i in unique(df$city)) {
paste0("cityb",i) <- (df[df$city %in% c("cityb", "i"), ])
}
for(唯一的i(df$city)){
paste0(“cityb”,i)给你:
步骤1:重新创建数据
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)
步骤3:使用lappy
创建数据帧列表。传递给lappy
的函数创建子集(使用与您在问题中尝试的逻辑类似的逻辑),然后使用order()
函数对其排序:
lapply(
setdiff(levels(dat$city), "b"),
function(i){
ret <- dat[dat$city %in% c("b", i), ]
ret[order(ret$var, ret$city), ]
})
如果city
列不是factor
,您可以执行:(对Andrie的
代码进行轻微修改:
lst <- lapply(letters[c(1, 3)], function(i) {
x1 <- rbind(dat[dat$city == "b", ], dat[dat$city == i, ])
indx <- seq(1, nrow(x1), by = 4) + rep(0:3, each = 2)
x1[indx, ]
}), paste0("dat", 1:2))
list2env(lst, envir=.GlobalEnv)
#<environment: R_GlobalEnv>
str(dat1)
#'data.frame': 8 obs. of 3 variables:
#$ city : chr "b" "a" "b" "a" ...
#$ var : chr "var1" "var1" "var2" "var2" ...
#$ value: num 0.67 0.19 0.38 0.14 0.42 0.59 0.37 0.28
str(dat2)
# 'data.frame': 8 obs. of 3 variables:
# $ city : chr "b" "c" "b" "c" ...
# $ var : chr "var1" "var1" "var2" "var2" ...
# $ value: num 0.67 0.19 0.38 0.27 0.42 0.27 0.37 0.91
lst@user3507584没有理由“将[[i]]中的每一个都保存为不同的数据帧”。很高兴它们都很好地列在一个列表中,这使得使用它们更加方便。这不起作用,因为paste
没有paste0(“cityb”,i)的赋值方法嗨,Akrun,Andie的代码很好用,但是你知道如何将每一对城市保存为数据框吗?嗨user3507584
。我编辑了代码。请检查这是否是你想要的。
[[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
lst <- lapply(letters[c(1, 3)], function(i) {
x1 <- rbind(dat[dat$city == "b", ], dat[dat$city == i, ])
indx <- seq(1, nrow(x1), by = 4) + rep(0:3, each = 2)
x1[indx, ]
}), paste0("dat", 1:2))
list2env(lst, envir=.GlobalEnv)
#<environment: R_GlobalEnv>
str(dat1)
#'data.frame': 8 obs. of 3 variables:
#$ city : chr "b" "a" "b" "a" ...
#$ var : chr "var1" "var1" "var2" "var2" ...
#$ value: num 0.67 0.19 0.38 0.14 0.42 0.59 0.37 0.28
str(dat2)
# 'data.frame': 8 obs. of 3 variables:
# $ city : chr "b" "c" "b" "c" ...
# $ var : chr "var1" "var1" "var2" "var2" ...
# $ value: num 0.67 0.19 0.38 0.27 0.42 0.27 0.37 0.91