【问题标题】:Loop over and count columns in a data frame until condition is met循环并计算数据框中的列,直到满足条件
【发布时间】:2021-07-27 01:17:03
【问题描述】:

我不熟悉 R 中的循环(以及堆栈溢出!)

我有一个data.frame,其中5:19 的列询问家庭成员的性别(成员 1、成员 2、成员 3 等)。

例如,如果一个人只有 2 个其他家庭成员,那么对于第 3 个性别的成员(列 7:19),值将是 NA(用负数表示)。

使用for-loop,我想使用这些变量来推导出household_size-变量的总数。

我的想法是设置一个家庭大小变量,然后为5:19 中的每一列加 1,直到找到值为负数的列。

#start with 1 for the respondent themselves 

DF$HHSIZE<-1

  for (i in DF[,5:19]){
  if_else (i>0, DF$HHSIZE<-DF$HHSIZE+1, break) 
  }

我在这里做错了,因为HHSIZE 上每个人的值计算为 2。它是 i>0 部分吗?我需要使用重复的for-loop 来代替吗?

提前致谢!

【问题讨论】:

  • 虽然您确实选择了答案,但您能否提供您的data.frame 中的dput,以使您的问题可重现。通过这种方式,如果可能,您可能会获得更有效和/或替代的解决方案。

标签: r loops


【解决方案1】:

我认为您可以使用 rowSums 和 is.na()。这里不需要 for 循环。

library(dplyr)

DF %>% mutate(HHSIZE=rowSums(across(5:19, ~!is.na(.x)))

一个带有两个 data.frame 的例子:

#toy dataframe:

df<-data.frame(name=c('bob', 'mike', 'john'),
               member1=c(1,1,1),
               member2=c(2,1,NA),
               member3=c(1, NA, NA),
               member4=c(NA, NA, NA))

解决方案:

DF %>% mutate(HHSIZE=rowSums(across(2:5, ~!is.na(.x)))

  name member1 member2 member3 member4   HHSIZE
1  bob       1       2       1      NA        3
2 mike       1       1      NA      NA        2
3 john       1      NA      NA      NA        1

也可以通过 for 循环来完成。只需创建一个空的数值向量,然后按行循环,并用数据框中所需列的非 na 元素的总和填充向量(在我的示例中为 2:5):

output<-numeric()
for (i in seq_len(nrow(df))){
        output[i]<-sum(!is.na(df[i, 2:5]))
}
df$HHSIZE<-output

【讨论】:

  • 感谢您的回答!现在就试试这个!
  • 请注意,这个解决方案实际上提供了你想要的,因为它不是返回 rowSums,而是按行返回非 na 元素 (rowSums ....... ~!is.na(.x)) 的总和
  • rowwise/c_across 变体:df %&gt;% rowwise() %&gt;% mutate(hhsize = sum(!is.na(c_across(2:5)), na.rm =TRUE))
  • 是的,andrew_reece。这效率较低,但也有效。我认为na.rm=TRUE 是不需要的,
  • 只是出于兴趣,有没有办法用循环来做到这一点?
猜你喜欢
  • 2016-04-29
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 2020-08-29
  • 2016-04-12
  • 2018-06-29
相关资源
最近更新 更多