我的数据集大约有 54,000 行。我想将一个值(First_Pass)设置为 T 或 F,这取决于另一列中的值以及之前是否见过该列的值。我有一个 for 循环,它完全符合我的需要。但是,该循环仅适用于数据的子集。我需要根据因子水平为不同的子集单独运行相同的 for 循环。
这似乎是 plyr 函数的完美案例,因为我想将数据拆分为子集,应用一个函数(我的 for 循环),然后重新加入数据。但是,我无法让它工作。首先,我给出一个名为 char.data 的 df 样本。
session_id list Sent_Order Sentence_ID Cond1 Cond2 Q_ID Was_y CI CI_Delta character tsle tsoc Direct
5139 2 b 9 25 rc su 25 correct 1 0 T 995 56 R
5140 2 b 9 25 rc su 25 correct 2 1 h 56 56 R
5141 2 b 9 25 rc su 25 correct 3 1 e 56 56 R
5142 2 b 9 25 rc su 25 correct 4 1 56 37 R
里面有些杂乱。关键列是 session_id、Sentence_ID、CI 和 CI_Delta。
然后我将一个名为 First_Pass 的列初始化为“F”
char.data$First_Pass <- "F"
我现在想计算每个 session_id 和 Sentence_ID 组合的 First_Pass 何时实际为“T”。我创建了一个玩具套装,它只是制定整体逻辑的一个子集。这是 for 循环的代码,它为我提供了我想要的玩具数据。
char.data.toy$First_Pass <- "F"
l <-c(200)
for (i in 1:nrow(char.data.toy)) {
if(char.data.toy[i,]$CI_Delta >= 0 & char.data.toy[i,]$CI %nin% l){
char.data.toy[i,]$First_Pass <- "T"
l <- c(l,char.data.toy[i,]$CI)}
}
我现在想使用这个循环并为每个 session_id 和 Sentence_ID 子集运行它。我创建了一个名为 set_fp 的函数,然后在 ddply 中调用它。这是该代码:
#define function
set_fp <- function (df){
l <- 200
for (i in 1:nrow(df)) {
if(df[i,]$CI_Delta >= 0 & df[i,]$CI %nin% l){
df[i,]$First_Pass <- "T"
l <- c(l,df[i,]$CI)}
else df[i,]$First_Pass <- "F"
return(df)
}
}
char.data.fp <- ddply(char.data,c("session_id","Sentence_ID"),function(df)set_fp(df))
不幸的是,这并不完全正确。很长一段时间以来,我都得到了 First_Pass 的所有“F”值。现在我得到了 24 个 T 值,而它应该更多,所以我怀疑它只保留了最后一个子集或类似的东西。帮助?