我的数据框看起来像:
df <- data.frame ("ID"=c(a, b, c, c, d, e, e), "K"= c(1, 1, 1, 1, 1, 1, 1),
"P"=c(1, 1, 1, 1, 2, 2, 1), "C"=c(1, 2, 1, 2, 1, 2, 1))
ID K P C
a 1 1 1
b 1 1 2
c 1 1 1
c 1 1 2
d 1 2 1
e 1 2 2
e 1 1 1
我试图折叠具有相同ID值的行。
对于没有重复ID值的行,我希望该行保持不变。
对于具有重复ID值(c&amp; e)的行,我希望它折叠行。对于每个列(K,P,C),我希望它查看每个重复行的值。如果K列中的两个值= 1,则输出应保持为1.如果K列中的两个值不等于1,则输出应为-99。 P列和C列相同。
理想情况下,输出看起来像:
ID K P C
1 a 1 1 1
2 b 1 1 2
3 c 1 1 -99
5 d 1 2 1
6 e 1 -99 -99
到目前为止,我只得到:
for (row in 1:nrow(df) ) {
if length(df$ID) >=2
}
但我很困惑,因为我甚至不知道这是否是正确的开始方式。
谢谢!
答案 0 :(得分:1)
plyr
包在这里很有用。
df <- data.frame ("ID"=c(1, 2, 3, 3, 4, 5, 5), "K"= c(1, 1, 1, 1, 1, 1, 1),
"P"=c(1, 1, 1, 1, 2, 2, 1), "C"=c(1, 2, 1, 2, 1, 2, 1))
library(plyr)
ddply(df, .variables = .(ID),
summarize,
K = if (length(K) == 1) K else if (all(K == 1)) 1 else -99,
P = if (length(P) == 1) P else if (all(P == 1)) 1 else -99,
C = if (length(C) == 1) C else if (all(C == 1)) 1 else -99)
请注意,此代码假定您的其他列对于具有相同ID的所有行具有相同的值。
df <- data.frame ("ID"=c(1, 2, 3, 3, 4, 5, 5), "K"= c(1, 1, 1, 1, 1, 1, 1),
"P"=c(1, 1, 1, 1, 2, 2, 1), "C"=c(1, 2, 1, 2, 1, 2, 1),
"extra1" = c("a", "b", "c", "c", "d", "e", "e"),
"extra2" = c("A", "B", "C", "C", "D", "E", "E"))
library(plyr)
df1 <- ddply(df, .variables = .(ID),
summarize,
K = if (length(K) == 1) K else if (all(K == 1)) 1 else -99,
P = if (length(P) == 1) P else if (all(P == 1)) 1 else -99,
C = if (length(C) == 1) C else if (all(C == 1)) 1 else -99)
df2 <- merge(df1, unique(df[, setdiff(names(df), c("K", "P", "C"))]),
by = "ID")
答案 1 :(得分:0)
这是使用baseR的另一种方法:
df <- data.frame ("ID"=c(1, 2, 3, 3, 4, 5, 5), "K"= c(1, 1, 1, 1, 1, 1, 1),
"P"=c(1, 1, 1, 1, 2, 2, 1), "C"=c(1, 2, 1, 2, 1, 2, 1))
dupl = with(df, duplicated(ID, K, P))
df$c = with(df, ifelse(dupl == TRUE & K == 1, -99, C)