无法遍历R中向量子集的值

时间:2018-04-26 10:33:25

标签: r function aggregate

如果问题非常基本,我很抱歉,我仍然是R的完全新手。

在我的数据集中,观察来自于被问及在6个月的时间内每个月在1到10的范围内有多满意的人。

没有义务参与,所以有时他们会回答,有时他们不回答。

我正在尝试构建一个变量来计算他们回答问题的次数。如果答案是> 0,我认为他们会回答。

首先,我从我的数据集中选择了相关变量并将它们存储到一个单独的数据框中(不要注意名称中的“平均值”),为了问题的目的,只考虑它是本月的单个答案):

monthly_sats <- select (donnees, average_satisfaction_march, average_satisfaction_april, 
                        average_satisfaction_may, average_satisfaction_june, 
                            average_satisfaction_july, average_satisfaction_august)

然后,我创建了一个变量,我将存储每个人回答的次数(因此,多少个月),并将其初始化为0.

donnees$monthly_sat_count <- 0

到目前为止一切顺利。然后,我写了以下内容:

for (i in monthly_sats) {
  for(j in i) {
    if (j > 0) {
      donnees$monthly_sat_count <- donnees$monthly_sat_count + 1
    }
  }
}

这就是我的意思: 对于monthly_sats数据框中的每个变量 对于这些变量中的每个值 如果该值大于0,则从“donnees”数据集中增加monthly_sat_count变量1.

我预计,对于我的数据集中的每一行,monthly_sat_counts将告知这些变量中有多少大于0.

结果是每一行的monthly_sat_counts都等于365,我不明白为什么。

请注意,我也尝试了子集而不是选择,结果完全相同。这是代码:

for (i in donnees[c("average_satisfaction_march", "average_satisfaction_april",
                        "average_satisfaction_may", "average_satisfaction_june",
                            "average_satisfaction_july", "average_satisfaction_august")]) {
  for(j in i) {
    if (j > 0) {
      donnees$monthly_sat_count <- donnees$monthly_sat_count + 1
    }
  }
}

如果我删除第二个for循环,只需使用下面的代码循环遍历向量列表,那么monthly_sat_count总是等于0:

for (i in donnees[c("average_satisfaction_march", "average_satisfaction_april",
                    "average_satisfaction_may", "average_satisfaction_june",
                        "average_satisfaction_july", "average_satisfaction_august")]) {
  if (i > 0) {
    donnees$monthly_sat_count <- donnees$monthly_sat_count + 1
}

我不知道它为什么这样做,我甚至不知道从哪里开始调试,因为我仍然无法理解R.我的唯一编程背景是一段时间以前的C#。

无论如何,如果有时候可以解释为什么它不起作用并告诉我一个更好的方法,它会真的让我的一天!

1 个答案:

答案 0 :(得分:1)

set.seed(123)
df <- as.data.frame(matrix(sample(c(0:10), 60, TRUE), ncol = 6))
colnames(df) <- wrapr::qc(average_satisfaction_march, average_satisfaction_april, 
               average_satisfaction_may, average_satisfaction_june, 
               average_satisfaction_july, average_satisfaction_august)

df$donnees <- c(1:10)
df <- df[,c(7,1:6)] 

df$timesanswered <- apply(df[,2:7], 1 , function(x) {length(x[x>0])})

首先我创建了一些示例数据。最后一行是计算每个donnee满意度的代码在一个月内不为零的代码。我假设您描述数据的方式没有丢失值,但是当donnee没有回答问题时会填写零?

您可以分别用average_satisfaction_march和average_satisfaction_august的列号替换2和7。无需创建单独的数据框即可完成此操作。