存储R循环结果并将其与新结果组合

时间:2018-01-21 04:57:07

标签: r

我对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的条件下给了我一个数据帧。我不知道循环有什么问题。谢谢!

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