【问题标题】:Sum of unique values in a column列中唯一值的总和
【发布时间】:2019-07-12 03:38:15
【问题描述】:

我想在满足某些条件后,每年得到一列中唯一值的总和。

这是我来自 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
))

我想要什么:

数据中有四列: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 中做到这一点吗? 如有任何帮助,我将不胜感激。

【问题讨论】:

    标签: r dplyr aggregate unique


    【解决方案1】:

    您可以通过之前使用的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
    

    【讨论】:

      【解决方案2】:

      使用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))
      

      【讨论】:

      • 感谢您的回答!!!!实际上,我尝试使用 dplyr 包中的“不同”,但给了我不正确的值。你知道我怎么也可以使用它吗?也许作为另一个答案,以便我可以投票。
      • @Lyndz 如果您想计算key 的唯一值,我们可以使用n_distinct。我最初因为sum of the unique "key" values 而感到困惑。我已经更新了答案。
      • @Lyndz 您是否在共享的相同数据上遇到错误?不过对我来说效果很好。您可以在通话中明确提及包名称吗?一定是从其他包中屏蔽功能的问题。试试df %&gt;% dplyr::group_by(Year) %&gt;% dplyr::filter(dist &lt;= 1100 &amp; !duplicated(key)) %&gt;% dplyr::summarise(RR = sum(RR), dist = sum(dist))
      • 啊..不,这是因为您的 RR 是字符类型。尝试做df %&gt;% group_by(Year) %&gt;% filter(dist &lt;= 1100 &amp; !duplicated(key)) %&gt;% summarise(RR = sum(as.numeric(RR), na.rm = TRUE))
      • @Lyndz 是的,因为你在那个地方有字符 NA。检查df$RR[1103:1110] 这些值是否转换为实际的NA 值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 2021-03-05
      • 2022-01-10
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多