2013-06-02 121 views
4

我已經搜索了以前回答的問題,但尚未能構建功能正常的解決方案。這裏是我的演示數據的情況:根據數據幀列表中N-1行的值選擇行N

說我有科目完成計算機任務,他們在每個試驗中給予答覆。我從關於他們是否給了準確的反應每次試驗結束與數據,以及他們的反應時間爲:

sub1 <- data.frame(acc = round(rnorm(10, mean=.65, sd=.25), 0), RT = round(rnorm(10, mean=270, sd=30), 0)) 
sub2 <- data.frame(acc = round(rnorm(10, mean=.65, sd=.25), 0), RT = round(rnorm(10, mean=270, sd=30), 0)) 
sub3 <- data.frame(acc = round(rnorm(10, mean=.65, sd=.25), 0), RT = round(rnorm(10, mean=270, sd=30), 0)) 

sub.list <- list(sub1, sub2, sub3) 

我創建了一個列表,其中每個元素都是一個對象的數據。

> sub.list 
[[1]] 
    acc RT 
1 1 259 
2 0 187 
3 1 256 
4 1 288 
5 1 304 
6 1 265 
7 1 312 
8 1 196 
9 1 335 
10 0 276 

[[2]] 
    acc RT 
1 1 215 
2 0 325 
3 1 290 
4 0 297 
5 0 281 
6 1 294 
7 0 289 
8 1 252 
9 0 364 
10 0 241 

[[3]] 
    acc RT 
1 0 292 
2 0 267 
3 0 240 
4 1 321 
5 1 292 
6 0 269 
7 1 241 
8 1 206 
9 1 250 
10 1 283 

現在來了我的問題。我想爲每個只有RTs的主題創建另一個列,以便進行精確的測試,而且之前也有精確的響應。這裏有一個 - 工作for循環和我試圖結束的例子。

for(i in 1:length(sub.list)){ 
    for(j in 2:nrow(sub.list[[i]])){ 
    if(sub.list[[i]][(j-1), "acc"]==1 & sub.list[[i]][j, "acc"]==1){ 
     sub.list[[i]][j,]$correct.RT <- sub.list[[i]][j, "RT"] 
    } else { 
     sub.list[[i]][j,]$correct.RT <- NA 
    } 
    } 
} 

> sub.list 
[[1]] 
    acc RT correctRT 
1 1 259  NA 
2 0 187  NA 
3 1 256  NA 
4 1 288  288 
5 1 304  304 
6 1 265  265 
7 1 312  312 
8 1 196  196 
9 1 335  335 
10 0 276  NA 

[[2]] 
    acc RT correctRT 
1 1 215  NA 
2 0 325  NA 
3 1 290  NA 
4 0 297  NA 
5 0 281  NA 
6 1 294  NA 
7 0 289  NA 
8 1 252  NA 
9 0 364  NA 
10 0 241  NA 

[[3]] 
    acc RT correctRT 
1 0 292  NA 
2 0 267  NA 
3 0 240  NA 
4 1 321  NA 
5 1 292  292 
6 0 269  NA 
7 1 241  NA 
8 1 206  206 
9 1 250  250 
10 1 283  283 

我這樣做的理由是,我可以單獨對這些試驗執行功能。例如:

> sapply(sub.list, function(x) mean(x$correctRT, na.rm=TRUE)) 
[1] 283.3333  NaN 257.7500 

我知道必須與mapply或其他的一個應用函數,而不是一個笨拙,緩慢的for循環來做到這一點的一種方式,但我掛了是如何引用順序排。

任何幫助非常感謝!

+0

不完全正確的時候應該是NA當sub.list [N,「acc」] == 0 ** OR ** sub.list [(N-1),「acc」] = = 0.希望更清楚。我想從acc = 1的試驗中得出RT,這些試驗在出現錯誤後纔會發生(上一行的acc = 0)。 – YTD

+0

爲了使數據具有可重現性,如果您要使用隨機樣本,請從'set.seed(123)'開始。 – flodel

+0

抱歉。在R中生成隨機樣本不太熟悉,但這對知道非常有用。我將來會這樣做。 – YTD

回答

4
sub.list <- lapply(sub.list, transform, 
        correctRT = ifelse(acc & c(0, head(acc, -1)), RT, NA)) 

但考慮到您的最終目標,我寧願創建一個標誌(TRUE/FALSE)變量:

sub.list <- lapply(sub.list, transform, 
        is.valid = acc & c(0, head(acc, -1))) 

然後計算平均值f例如:

sapply(sub.list, with, mean(RT[is.valid])) 
+0

+1提到另一個'is.valid'列會很有用。 – Thilo

+0

感謝大家的幫助和建議!我從你的每個帖子中學到了東西。我結束了沿着這些路線的東西。 – YTD

+1

'Hmisc'軟件包有一個'Lag'便利功能,可以替代'c(0,...)'構造。 – krlmlr

2

可以使用mutate功能在plyr包來實現這一任務

讓我們先來重新創建數據和設置seeed使這個例子reproductible。

set.seed(123) 
sub1 <- data.frame(acc = round(rnorm(10, mean=.65, sd=.25), 0), 
        RT = round(rnorm(10, mean=270, sd=30), 0)) 
sub2 <- data.frame(acc = round(rnorm(10, mean=.65, sd=.25), 0), 
        RT = round(rnorm(10, mean=270, sd=30), 0)) 
sub3 <- data.frame(acc = round(rnorm(10, mean=.65, sd=.25), 0), 
        RT = round(rnorm(10, mean=270, sd=30), 0)) 

sub_list <- list(sub1, sub2, sub3) 

現在我們可以將mutate功能,每個數據幀在列表

require(plyr) 
lapply(sub_list, mutate, acclag = c(NA, head(acc, -1)), 
        correctRT = ifelse((acc == 0 | acclag == 0), NA, RT)) 

## [[1]] 
## acc RT acclag correctRT 
## 1 1 307  NA  NA 
## 2 1 281  1  281 
## 3 1 282  1  282 
## 4 1 273  1  273 
## 5 1 253  1  253 
## 6 1 324  1  324 
## 7 1 285  1  285 
## 8 0 211  1  NA 
## 9 0 291  0  NA 
## 10 1 256  0  NA 

## [[2]] 
## acc RT acclag correctRT 
## 1 0 283  NA  NA 
## 2 1 261  0  NA 
## 3 0 297  1  NA 
## 4 0 296  0  NA 
## 5 0 295  0  NA 
## 6 0 291  0  NA 
## 7 1 287  0  NA 
## 8 1 268  1  268 
## 9 0 261  1  NA 
## 10 1 259  0  NA 

## [[3]] 
## acc RT acclag correctRT 
## 1 0 278  NA  NA 
## 2 1 269  0  NA 
## 3 0 269  1  NA 
## 4 1 311  0  NA 
## 5 1 263  1  263 
## 6 0 315  1  NA 
## 7 1 224  0  NA 
## 8 1 288  1  288 
## 9 1 274  1  274 
## 10 1 276  1  276 
+0

謝謝,你是對的...將會糾正它 – dickoa

+0

+1使用mutate。 – Thilo

2
lapply(sub.list, 
     function(x) { 
     a <- x$acc 
     # Choose elements which are true, and previous is also true: 
     b <- a & c(0, a[-length(a)]) 
     x$correctRT <- ifelse(b, x$RT, NA) 
     x 
     })