【问题标题】:Assignment in an if statment over data frame?在数据帧上的 if 语句中赋值?
【发布时间】:2021-05-28 05:46:24
【问题描述】:

我希望有人可以看看下面的 if 语句并告诉我应该如何更改它以获得我想要的结果。

基本上,我希望代码 (1) 遍历(迭代)数据框 beh_data 中的每一行,以及 (2) 如果“Cue”列中的字符与“face1”列中的字符相同,我想(3)从“Enc_trials.thisRepN”列中获取值,(4)将其分配给“scr_of_trial”列。如果它们不相同,我想为“scr_of_trial”列分配一个 NA。

目前,代码运行,但将 NA 分配给“scr_of_trial”列中的每一行。

谁能告诉我为什么?

代码如下:

j <- 1
i = as.character(beh_data$Cue[1:1])

for (x in 1:NROW(beh_data$Cue)) {
  if (beh_data$Cue[j] == beh_data$face1[j]) {
    beh_data$scr_of_trial[j] <- beh_data$Enc_trials.thisRepN[j]

j <- j + 1
i = as.character(beh_data$Cue[1:1+j])
}

else {
  beh_data$scr_of_trial[j] <- NA

  j <- j + 1
  i = as.character(beh_data$Cue[1:1+j])
  
  next

 }
}  

【问题讨论】:

  • 请添加数据的最小表示,包括输出示例。否则不可能给你可靠的建议,除了可能。

标签: r for-loop if-statement assign


【解决方案1】:

将您的思维转变为一次使用整个向量。

一些技巧:

  1. ifelse;虽然它在这里工作正常,但要意识到ifelseissues with class

    beh_data$scr_of_trial <- ifelse(beh_data$Cue == beh_data$face1,
                                    beh_data$Enc_trials.thisRepN, NA_character_)
    
  2. replace;类似的功能,没有class 问题:

    replace(beh_data$Enc_trials.thisRepN, beh_data$Cue != beh_data$face1, NA_character_)
    
  3. 使用我所说的“指标变量”:

    ind <- beh_data$Cue == beh_data$face1
    beh_data$scr_of_trial <- NA_character_
    beh_data$scr_of_trial[ind] <- beh_data$Enc_trials.thisRepN
    

没有for 循环,一次只有整个向量。

在合理的情况下,我倾向于使用特定于类的NA 类型,例如NA_character_;虽然基本 R 的函数会很高兴地为您向上转换为您拥有的任何类,但 R 中的许多其他方言(例如,dplyrdata.table)不那么宽松。有点声明式编程,有点风格,也许有点势利,我不知道……

(这都是未经实际数据测试的。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-30
    • 2015-07-15
    • 1970-01-01
    • 2020-01-20
    • 2011-10-31
    • 2021-08-13
    • 2020-08-07
    • 1970-01-01
    相关资源
    最近更新 更多