Сумма уникальных значений в столбце - PullRequest
1 голос
/ 12 июля 2019

Я хочу получить сумму уникальных значений в столбце за год после выполнения некоторых условий.

Вот мои данные из dput:

structure(list(key = structure(c(1L, 1L, 4L, 2L, 3L, 4L, 2L, 
3L, 5L, 5L, 8L, 6L, 7L, 8L, 6L, 7L), .Label = c("1992_10_18_0", 
"1992_10_18_12", "1992_10_18_18", "1992_10_18_6", "1993_10_18_0", 
"1993_10_18_12", "1993_10_18_18", "1993_10_18_6"), class = "factor"), 
 RR = c(43.25, 43.25, 43.25, 43.25, 43.25, 43.25, 43.25, 43.25, 
 43.25, 43.25, 43.25, 43.25, 43.25, 43.25, 43.25, 43.25), 
 dist = c(1000.23361607017, 694.022935174544, 748.618896699399, 
 812.290633745208, 869.896619169459, 1136.88564181537, 
 1058.59136791648, 
 975.756885299645, 1000.23361607017, 694.022935174544, 
 748.618896699399, 
 812.290633745208, 869.896619169459, 1136.88564181537, 
 1058.59136791648, 
 975.756885299645), Year = c(1992L, 1992L, 1992L, 1992L, 1992L, 
 1992L, 1992L, 1992L, 1993L, 1993L, 1993L, 1993L, 1993L, 1993L, 
1993L, 1993L)), class = "data.frame", row.names = c(NA, -16L
))

Что яwant:

В данных есть четыре столбца: key, RR, dist и Year.

Я хочу получить сумму RR на основе уникальных значений «ключа»в год, так что «dist» меньше или равен 1100.

Что у меня есть:

Я обрабатываю несколько файлов, поэтому скриптэто:

dat<-read.csv("test_dat.csv",header=T,stringsAsFactors=FALSE)

dat2<-dat[which(dat$dist <= 1100),]
dat3<-as.data.frame(cbind(dat2$RR,dat2$Year))
colnames(dat3)<-c("RR","Year")
agg<-aggregate(.~Year,dat3,sum,na.rm=T)

write.csv(agg,file="test.csv",row.names=T)

Есть идеи о том, как я могу сделать это в R?Я буду признателен за любую помощь.

Ответы [ 2 ]

2 голосов
/ 12 июля 2019

Вы можете сделать это с помощью функции aggregate, как вы использовали, в сочетании с функцией unique:

agg <- aggregate(key ~ Year, data=subset(dat, dist <= 1100), FUN=function(x) length(unique(x)))

или в полном контексте:

dat<-read.csv("test_dat.csv",header=T,stringsAsFactors=FALSE)
agg <- aggregate(key ~ Year, data=subset(dat, dist <= 1100), FUN=function(x) length(unique(x)))
write.csv(agg,file="test.csv",row.names=T)

В этом примере сгенерированный вывод:

  Year key
1 1992   4
2 1993   4
1 голос
/ 12 июля 2019

Одним из способов использования dplyr может быть filter значение dist меньше 1100 и сохранение только уникальных значений для столбцов key и sum RR и dist.

library(dplyr)

df %>%
  group_by(Year) %>%
  filter(dist <= 1100 & !duplicated(key)) %>%
  summarise(RR = sum(RR), dist = sum(dist))

Для подсчета различных значений мы можем использовать n_distinct

df %>%
  filter(dist <= 1100) %>%
  group_by(Year) %>%
  summarise(n = n_distinct(key))
...