【问题标题】:Replacement has 0 rows, data has 1400?替换有0行,数据有1400?
【发布时间】:2020-08-06 21:05:20
【问题描述】:

我检查了其他问题并没有真正找到解决方案。

我正在尝试根据一组条件更新我的数据框中的向量,如下所示:

EEG3$CorrectFinal <-as.character(EEG3$CorrectFinal)
subjectlist1 = c("s002","s004","s010","s011","s012","s017","s018","s019","s020","s025","s026","s028")
for (i in subjectlist1) {
EEG3$CorrectFinal <- ifelse (EEG3$subject == subjectlist1[i] & EEG3$trial <326 & EEG3$Deviant == 101 & EEG3$Correct == 222|EEG$subject == subjectlist1[i] & EEG3$trial <326 & EEG3$Deviant == 102 & EEG3$Correct == 155|EEG3$subject  == subjectlist1[i] & EEG3$trial >326 & EEG3$Deviant == 101 & EEG3$Correct == 155|EEG$subject == subjectlist1[i] & EEG3$trial >326 & EEG3$Deviant == 102 & EEG3$Correct == 222, yes = 1, no = EEG3$CorrectFinal)}

然后我收到以下错误消息: Error in `$&lt;-.data.frame`(`*tmp*`, "CorrectFinal", value = logical(0)) : replacement has 0 rows, data has 20

所以我在数据框中创建了一个零向量(列),并将条件分配给任一,如果为真,则填充 1,如果不是,则保持相同的值(即 0)。我只是不明白为什么我会收到此错误消息,或者此脚本在哪里中断。

这里有一些用示例数据框重现问题的代码:

EEG3 <-read.table(header = TRUE, text ="  subject trial Deviant Correct CorrectFinal
1     s002     1     101     102            0
                    2     s002     2     102     101            0
                    3     s002     3     101     155            0
                    4     s002     4     101     155            0
                    5     s002     5     101     155            0
                    6     s002     6     101     155            0
                    7     s002     7     102     222            0
                    8     s002     8     101     155            0
                    9     s002     9     101     155            0
                    10    s002    10     102     222            0
                    11    s002    11     101     222            1
                    12    s002    12     101     222            1
                    13    s002    13     101     222            1
                    14    s002    14     101     222            1
                    15    s002    15     102     155            1
                    16    s002    16     101     222            1
                    17    s002    17     101     155            0
                    18    s002    18     101     222            1
                    19    s002    19     102     155            1
                    20    s002    20     101     222            1")

> ``` 

【问题讨论】:

  • mydata 应该是 EEG3 吗?
  • 顺便说一句,您是否忽略了trial326?您的逻辑确保它永远不会匹配。

标签: r dataframe for-loop if-statement


【解决方案1】:

您的示例代码在我的控制台上没有出错,但有一个问题可能会导致您的问题。

在循环中单步执行您的代码。使用mydata 作为EEG3,如果你进入你的for 循环,

for (i in subjectlist1) {
  message(sprintf("i='%s', subjectlist1[i]='%s'", i, subjectlist1[i]))
  EEG3$CorrectFinal <- ifelse ( ... )    
}

您会立即看到第一条消息是i='s002', subjectlist1[i]='NA' ...

您的 for 循环正在迭代实际值,而不是向量 subjectlist1 上的索引。

使用以下两种模型之一:

  1. for (i in seq_along(subjectlist1)) 并保留其余代码,因为 i 现在将是一个整数;或
  2. for (i in subjectlist1) 并将所有内部 subjectlist1[i] 更改为 i,因为 i 将是一个字符串。

旁注:您的逻辑顺序可能不是您所需要的。每当我开始嵌套&amp;| 时,我都会使用括号来锁定我需要的实际逻辑。例如,我推断你需要这样的东西:

for (i in subjectlist1) {
  EEG3$CorrectFinal <- 
    ifelse (
      EEG3$subject == subjectlist1[i] & (
        (EEG3$trial < 326 & EEG3$Deviant == 101 & EEG3$Correct == 222) |
        (EEG3$trial < 326 & EEG3$Deviant == 102 & EEG3$Correct == 155) |
        (EEG3$trial > 326 & EEG3$Deviant == 101 & EEG3$Correct == 155) |
        (EEG3$trial > 326 & EEG3$Deviant == 102 & EEG3$Correct == 222)
      ), yes = 1, no = EEG3$CorrectFinal)
}

这实际上可以简化一点,完全不需要 for 循环。

先是你的代码,然后是我的:

# this is just to prepopulate the CorrectFinal2 variable to compare your for loop with my code
EEG3$CorrectFinal2 <- EEG3$CorrectFinal

# your code, adjusted
for (i in seq_along(subjectlist1)) {
  EEG3$CorrectFinal <- 
    ifelse (
      EEG3$subject == subjectlist1[i] & (
        (EEG3$trial < 326 & EEG3$Deviant == 101 & EEG3$Correct == 222) |
        (EEG3$trial < 326 & EEG3$Deviant == 102 & EEG3$Correct == 155) |
        (EEG3$trial > 326 & EEG3$Deviant == 101 & EEG3$Correct == 155) |
        (EEG3$trial > 326 & EEG3$Deviant == 102 & EEG3$Correct == 222)
      ), yes = 1, no = EEG3$CorrectFinal)
}
ind <- with(EEG3, {
  subject %in% subjectlist1 & (
    (trial < 326 & Deviant == 101 & Correct == 222) |
    (trial < 326 & Deviant == 102 & Correct == 155) |
    (trial > 326 & Deviant == 101 & Correct == 155) |
    (trial > 326 & Deviant == 102 & Correct == 222))
})
EEG3$CorrectFinal2[ind] <- 1

EEG3
#    subject trial Deviant Correct CorrectFinal CorrectFinal2
# 1     s002     1     101     102            0             0
# 2     s002     2     102     101            0             0
# 3     s002     3     101     155            0             0
# 4     s002     4     101     155            0             0
# 5     s002     5     101     155            0             0
# 6     s002     6     101     155            0             0
# 7     s002     7     102     222            0             0
# 8     s002     8     101     155            0             0
# 9     s002     9     101     155            0             0
# 10    s002    10     102     222            0             0
# 11    s002    11     101     222            1             1
# 12    s002    12     101     222            1             1
# 13    s002    13     101     222            1             1
# 14    s002    14     101     222            1             1
# 15    s002    15     102     155            1             1
# 16    s002    16     101     222            1             1
# 17    s002    17     101     155            0             0
# 18    s002    18     101     222            1             1
# 19    s002    19     102     155            1             1
# 20    s002    20     101     222            1             1

(我认为括号、缩进、逻辑组件的减少以及没有for 循环使其更具可读性。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-10
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    相关资源
    最近更新 更多