我检查了其他问题,但没有找到真正的解决方案。
我正在尝试更新我的数据帧中的一个向量,它基于一系列如下的条件:
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)。我只是不明白为什么我会收到这个错误消息,或者这个脚本在哪里被破坏了。
以下是使用示例数据帧重现该问题的一些代码:
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")
> ``` 发布于 2020-08-07 05:25:10
您的示例代码在我的控制台上没有错误,但是有一个问题可能会导致您这一端的问题。
单步执行循环中的代码。使用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上的索引。
使用以下两种模型之一:
for (i in seq_along(subjectlist1))并保留剩余的代码,因为i现在将是一个整数;orfor (i in subjectlist1)并将所有内部subjectlist1[i]更改为i,因为i将是一个字符串。附注:您的逻辑顺序可能不是您需要的。每当我开始嵌套&和|时,我都会使用括号来锁定我需要的实际逻辑。例如,我推断你需要这样的东西:
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循环可以使它更具可读性。)
https://stackoverflow.com/questions/63291735
复制相似问题