【发布时间】:2012-10-25 11:45:00
【问题描述】:
我有一个如下所示的数据框:
df <- data.frame(
Logical = c(TRUE,FALSE,FALSE,FALSE,FALSE,FALSE),
A = c(1,2,3,2,3,1),
B = c(1,0.05,0.80,0.05,0.80,1),
C = c(1,10.80,15,10.80,15,1))
看起来像:
Logical A B C
1 TRUE 1 1.00 1.0
2 FALSE 2 0.05 10.8
3 FALSE 3 0.80 15.0
4 FALSE 2 0.05 10.8
5 FALSE 3 0.80 15.0
6 FALSE 1 1.00 1.0
我想添加一个新变量D,它是一个基于以下规则的整数:如果df$Logical 是TRUE,则为0,或者对于所有行都相同的整数变量A、B 和C 大致相等(因为它们是双精度数,因此在浮点误差范围内),从1 开始。
这里的预期输出:
Logical A B C D
1 TRUE 1 1.00 1.0 0
2 FALSE 2 0.05 10.8 1
3 FALSE 3 0.80 15.0 2
4 FALSE 2 0.05 10.8 1
5 FALSE 3 0.80 15.0 2
6 FALSE 1 1.00 1.0 3
第一行得到0,因为Logical是TRUE,第二行和第四行得到1,因为变量A、B和C在那里大致相等,第二和第五行相同排。第六行得到一个3,因为它是下一个唯一的行。请注意,D 中分配的整数顺序无关紧要,0 除外。例如,第 2 行和第 4 行也可以分配为 2,只要此整数在 D 的其他情况下是唯一的。
我考虑过使用聚合函数。例如使用ddply:
library("plyr")
df$foo <- 1:nrow(df)
foo <- dlply(df,.(A,B,C),'[[',"foo")
df$D <- 0
for (i in 1:length(foo)) df$D[foo[[i]]] <- i
df$D[df$Logical] <- 0
有效,但我不确定这对浮点错误的效果如何(我想我可以在此调用之前对此处的值进行四舍五入,但它应该相当稳定)。使用循环很容易:
df$D <- 0
c <- 1
for (i in 1:nrow(df))
{
if (!isTRUE(df$Logical[i]) & df$D[i]==0)
{
par <- sapply(1:nrow(df),function(j)!df$Logical[j]&isTRUE(all.equal(unlist(df[j,c("A" ,"B", "C")]),unlist(df[i,c("A" ,"B", "C")]))))
df$D[par] <- c
c <- c+1
}
}
但这对于较大的数据帧来说非常慢。
【问题讨论】:
-
您能否将列
A、B和C转换为因子?使用示例数据集,看起来就可以了(浮点数的容差问题)