id
변수에 대한 중복 값이 포함 된 데이터 프레임 (~ 5000 행, 6 열)이 있습니다. 또 다른 연속 변수 x
을 가지고 있는데, 각 값은 각 복제본에 대해 합계를 내고 싶습니다. id
. 관찰 시간은 시간에 따라 다르며 변수는 year
과 month
입니다. 각 복제본의 시간순으로 첫 번째 관찰을 유지하고 id
후속 반복문을이 첫 번째 관찰에 추가하고 싶습니다.중복을 합친 다음 첫 번째 발생을 제외한 모든 것을 제거합니다.
나는 가지고있는 것과 유사한 더미 데이터를 포함했습니다 : dat1
. 또한 원하는 결과의 구조를 보여주는 데이터 세트를 포함 시켰습니다 : outcome
.
저는 두 가지 전략을 시도했지만, 어느 것도 나에게 원하는 것을주지는 못합니다 (아래 참조). 첫 번째 전략은 나에게 x
에 대한 올바른 값을 제공하지만 내 연월 열이 느슨합니다. 모든 첫 번째 중복 값 id
값을 유지해야합니다. 두 번째 전략은 x
값을 올바르게 합산하지 않습니다.
원하는 결과를 얻는 방법에 대한 제안 사항에 많은 감사를드립니다.
# dummy data set
set.seed(179)
dat1 <- data.frame(id = c(1234, 1321, 4321, 7423, 4321, 8503, 2961, 1234, 8564, 1234),
year = rep(c("2006", "2007"), each = 5),
month = rep(c("December", "January"), each = 5),
x = round(rnorm(10, 10, 3), 2))
# desired outcome
outcome <- data.frame(id = c(1234, 1321, 4321, 7423, 8503, 2961, 8564),
year = c(rep("2006", 4), rep("2007", 3)),
month = c(rep("December", 4), rep("January", 3)),
x = c(36.42, 11.55, 17.31, 5.97, 12.48, 10.22, 11.41))
# strategy 1:
library(plyr)
dat2 <- ddply(dat1, .(id), summarise, x = sum(x))
# strategy 2:
# partition into two data frames - one with unique cases, one with dupes
dat1_unique <- dat1[!duplicated(dat1$id), ]
dat1_dupes <- dat1[duplicated(dat1$id), ]
# merge these data frames while summing the x variable for duplicated ids
# with plyr
dat3 <- ddply(merge(dat1_unique, dat1_dupes, all.x = TRUE),
.(id), summarise, x = sum(x))
# in base R
dat4 <- aggregate(x ~ id, data = merge(dat1_unique, dat1_dupes,
all.x = TRUE), FUN = sum)
와우, 훌륭합니다! 저는 수학을 퍼지하지 않았습니다 - 저는 코드 상단에 시드 번호를 복사하지 않았을 것이라고 생각합니다. 나는 그 시드를 사용할 때 코드를 사용하여 '결과'데이터 세트에 내린 값을 얻습니다. 그런 깔끔한 두 개의 라이너를 가져 주셔서 감사합니다! – Chris
Ooops. 죄송합니다. 작은 데이터 였기 때문에 무작위로 설정된 시드를 놓친 것 같습니다. 프레임. –