【问题标题】:No difference in dataframe after for loop in RR中for循环后数据帧没有区别
【发布时间】:2019-12-06 12:05:46
【问题描述】:

我是 Stackoverflow 的新手,还没有找到可以回答我问题的主题,所以我现在在这里发布!

我正在尝试将数据框中的是/否字符更改为整数 1 和 2。我只想对 45 个主题中的四个这样做。我想使用 ifelse 语句进行 for 循环来执行此操作。该循环起初似乎可以工作,但是当我打开它或查看 head(data) 时,我的数据框没有任何变化。

数据框称为“gatingdata”,列称为“correct_buttonBox”。

这就是我所做的:

ffor row in 1:nrow(gatingdata$correct_buttonBox)) {
  if (gatingdata$subject_nr == "19") {
    ifelse(gatingdata$correct_buttonBox=="no", 1, 2)
  }  if (gatingdata$subject_nr == "27") {
    ifelse(gatingdata$correct_buttonBox=="no", 1, 2)
  } if (gatingdata$subject_nr == "35") {
    ifelse(gatingdata$correct_buttonBox=="no", 1, 2)
  } if (gatingdata$subject_nr == "42") {
    ifelse(gatingdata$correct_buttonBox=="no", 1, 2)
  }
}

我也试过了:

for(row in 1:nrow(gatingdata$correct_buttonBox)) {
  which[(gatingdata$subject_nr == "19"),] {
    ifelse(gatingdata$correct_buttonBox=="no", 1, 2)
  }  which[(gatingdata$subject_nr == "27"),] {
    ifelse(gatingdata$correct_buttonBox=="no", 1, 2)
  } which[(gatingdata$subject_nr == "35"),] {
    ifelse(gatingdata$correct_buttonBox=="no", 1, 2)
  } which[(gatingdata$subject_nr == "42"),] {
    ifelse(gatingdata$correct_buttonBox=="no", 1, 2)
  }
} 

我也尝试使用“i in 1:length(data$column)”。也没有用。

如果有人能告诉我我做错了什么,我将非常感激!我在在线搜索中找不到与我的问题相关的任何信息,我已经尝试解决这个问题几个小时了。这是循环的第 7 或第 8 个版本,但对我来说,这似乎是最合乎逻辑的......

最好的,

M.H.

【问题讨论】:

  • 您根本没有在 for 循环中使用 row....
  • 语法上这有点乱,我需要一些时间来学习如何构造 for 循环和 if else 语句。你也用错了which
  • 您能否编辑您的答案以包含dput(head(gatingdata, 50)) 的输出?这将使我们看到您的数据集的前 50 行,这将更容易提供帮助。
  • 非常感谢大家的回答!我现在确实在没有 for 循环的情况下解决了它!我发现循环比我的主管对我的预期要复杂一些。我找到了 s.b.在我的大学里,他将举办更多关于统计方法的研讨会,我将参加!

标签: r dataframe for-loop if-statement


【解决方案1】:

几个问题:

  1. 以这种方式循环在 R 中很少是正确的解决方案(逻辑索引会更好)。
  2. 您没有将ifelse 调用的结果存储在任何地方。
  3. “correct_buttonBox”似乎是字符数据,但您正在尝试交换数字数据。

没有循环的更有效的方法是利用 R 的逻辑索引。像下面这样的东西可能会起作用。我建议您在这里检查每一行代码的结果,以了解发生了什么。请注意,我在这里始终使用字符数据(即subject == '42',而不是subject == 42,但从您的示例中不清楚这是正确的。使用str(gatingdata) 检查您的数据格式。

subjects <- gatingdata$subject %in% c('19', '27', '35', '42') # logical vector of subjects of interest
yes <- gatingdata$correct_buttonBox == 'yes' # logical vector of 'yes' responses
no <- gatingdata$correct_buttonBox == 'no' # logical vector of 'no' responses

gatingdata$correct_buttonBox[subjects & yes] <- '2' # recode yes's
gatingdata$correct_buttonBox[subjects & no] <- '1' # recode no's

【讨论】:

  • 非常感谢您快速而有帮助的回答!该循环是主管的建议....我会尝试您的建议!对我来说,这似乎更具可追溯性和逻辑性!
  • 我唯一不明白的是,如何在我的数据框中进行更改?我是否必须将所有这些嵌套在应用函数中?
  • 有很多方法可以访问和修改数据框的内容。试试输入?”$”
  • 如果我使用您发布的代码执行此操作,那么我的数据框中不会发生任何事情。它看起来仍然像以前一样。也许还有另一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 2015-04-05
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多