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



我对R循环很陌生,很抱歉这个问题太简单了。我正在尝试为子集数据编写一个循环。代码是:

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

您可以通过将 s1 中的值与 a1 匹配来避免循环和子集行for

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

已经提到了很好的评论和答案。我仍然想澄清几点可以帮助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

相关内容

最新更新