簡體   English   中英

根據先前的值更改變量值

[英]change variable values based on preceding value

我有以下數據集:

df <- data.frame(subject = c(1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3), 
             time = c(1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,11), 
             performance = c(1,0,-1,-1,0,1,1,-1,0,0,0,1,1,1,-1,0,1,1,-1,0,0,1,-1,1,1,0,1,1,-1,0,-1,-1,0))

我想做的是更改性能變量中的某些條目。 更具體地說,如果在“ -1”項之前添加“ 1”,我想將“ -1”更改為“ 0”。

但是,這僅應在科目范圍內完成,而不應在科目范圍內完成(所有科目都有不同的會話次數)。

所以,這就是我最后想要的:

 df2 =data.frame(subject = c(1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3), 
                        time = c(1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,11), 
                        performance = c(1,0,-1,-1,0,1,1,0,0,0,0,1,1,1,0,0,1,1,0,0,0,1,-1,1,1,0,1,1,-1,0,-1,-1,0))

有誰知道如何做到這一點?

提前致謝! S.

使用dplyr

df %>% 
  group_by(subject) %>% 
  mutate(performance = replace(performance, which(performance + lag(performance)==0 & performance == -1), 0))

這是一個data.table方法,其中我首先創建一個flag列,然后將其用於子集數據並通過引用更新performance列。

library(data.table)
dt <- as.data.table(df) # or setDT(df)
dt[, flag := performance == -1 & shift(performance, 1L) == 1, by = subject]
dt[(flag), performance := 0][, flag := NULL]

我選擇使用中間的標記列來完成此操作,因為我希望它對於大型數據集能夠表現出色。 如果您不關心性能,那么當然可以使用ifelsereplace

這很丑陋,但應該可以工作:

dftest <- df
for (i in 2:nrow(dftest)) {
  if(
    dftest$performance[i] == -1 && dftest$performance[i - 1] == 1
  ){
    if(
      dftest$subject[i] == dftest$subject[i - 1]
    ) {
      dftest$performance[i] <- 0
    }
 }
}

all.equal(df2, dftest) # ONE ERROR

這在第29行給出了錯誤-您可以在這里檢查示例df2是否正確嗎? 如果我正確理解問題,則df2$performance[29]應該為0

使用bysapply基本R解決方案:

gr <- do.call(c, by(df, df$subject, function(x) {
c(FALSE, unlist(sapply(1:length(x$performance), 
function(y) (x$performance[y] == -1) & (x$performance[y-1] == 1))))
}))
df[gr, 3] <- 0
cbind(df, df2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM