首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换有0行,数据有1400行?

替换有0行,数据有1400行?
EN

Stack Overflow用户
提问于 2020-08-07 05:05:21
回答 1查看 381关注 0票数 0

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

我正在尝试更新我的数据帧中的一个向量,它基于一系列如下的条件:

代码语言:javascript
复制
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 `$<-.data.frame`(`*tmp*`, "CorrectFinal", value = logical(0)) : replacement has 0 rows, data has 20

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

以下是使用示例数据帧重现该问题的一些代码:

代码语言:javascript
复制
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")

> ``` 
EN

回答 1

Stack Overflow用户

发布于 2020-08-07 05:25:10

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

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

代码语言:javascript
复制
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现在将是一个整数;or
  2. for (i in subjectlist1)并将所有内部subjectlist1[i]更改为i,因为i将是一个字符串。

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

代码语言:javascript
复制
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循环的需要。

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

代码语言:javascript
复制
# 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循环可以使它更具可读性。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63291735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档