我对R loop很新,如果这个问题太简单,对不起。我正在尝试为子集数据编写循环。代码是:
a <- sample(rep(1:5, 10), 10)
b <- sample(rep(1:5, 10), 10)
c <- data.frame(a, b)
s <- c(1,2)
for (i in s){
x <- data.frame()
x <- rbind(x, c[which(a==i),])
}
x仅包括a = 2的结果。但是当我删除x并使用了print()命令时,它在a = 1和a = 2的条件下给了我一个数据帧。我不知道循环有什么问题。谢谢!
答案 0 :(得分:4)
您可以通过将for
中的值与s1
相匹配来避免a1
循环和子集行。
set.seed(1L)
a1 <- sample(rep(1:5, 10), 10)
b1 <- sample(rep(1:5, 10), 10)
c1 <- data.frame(a1, b1)
s1 <- c(1,2)
a1 %in% s1
# [1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE TRUE FALSE
c1[ a1 %in% s1, ]
# a1 b1
# 6 1 3
# 7 2 2
# 9 2 1
答案 1 :(得分:1)
已经提到了很好的评论和答案。我仍然想澄清几点可以帮助OP
。
显然for-loop
非常r-like
,因为在许多情况下,循环效率不高。即使您想在循环中修复问题,也只需将其修改为:
# Calling seed will ensure same output from function like sample. This will
# generate consistent result in every attempt
set.seed(1)
a <- sample(rep(1:5, 10), 10)
b <- sample(rep(1:5, 10), 10)
c <- data.frame(a, b) # good to name it df
s <- c(1,2)
# Fix for-loop
x <- data.frame() #assign x out of the for-loop
for (i in s){
x <- rbind(x, c[which(a==i),])
}
#Result
> x
# a b
#6 1 3
#7 2 2
#9 2 1
# R-like approach
> c[c$a %in% s,] #use the column of 'c' dataframe directly in condition
# a b
#6 1 3
#7 2 2
#9 2 1