【问题标题】:Summing/Counting equal values/rows of a data frame对数据帧的相等值/行求和/计数
【发布时间】:2020-08-18 01:01:28
【问题描述】:

我有一个数据框,其中包含一堆单独的行程数据,每次行程都有一个起点和终点站 ID。

我正在尝试制作第二个数据框,其中包含为每个站点重新排列的所有信息。例如,如果在第一个数据帧中有 50 次行程的 start_station_id == 12,那么在 station_id 12 下的第二个数据帧的“starts”列将等于 50

目前我认为for 循环将是解决此问题的最佳方法,但我似乎无法破解它

for(i in range(station_ids)){
   stationData$starts[i] <- sum(data$start_station_id[i] == station_ids[i])
}

这会产生以下错误:

Error in `$<-.data.frame`(`*tmp*`, starts, value = c(0, 0, 0, 0, 0, 0,  : 
  replacement has 370 rows, data has 369

station_id's 是一个包含每个唯一站 id # 的变量,stationData$starts 是我想要存储启动次数的位置。数据是我试图运行 for 循环的原始数据。

有没有更简单的方法来完成这个操作,还是我只是写错了 for 循环?任何提示都会非常有帮助

【问题讨论】:

  • 请使用dput 添加数据并显示相同的预期输出。请阅读有关how to ask a good question 以及如何提供reproducible example 的信息。
  • 在没有数据样本的情况下很难提供帮助,但是像 ddply(data, .(station_id), summarise, &lt;summary functions&gt;) 这样的东西可以在没有循环的情况下做你想做的事情
  • 你不应该使用data$start_station_id == station_ids[i],而且使用table函数会更快=> table(data$start_station_id)

标签: r for-loop


【解决方案1】:

根据我从您的问题中了解到的情况,您正在尝试计算每个 station_id 的出现次数,这可以通过返回 table 对象的 table 函数轻松实现,即包含计数的命名向量和station_id 作为名称。

基地R

table(data$start_station_id)
data.frame(table(data$start_station_id)) #if you prefer the data.frame look

如果您想将出现次数合并到旧的data.frame 中,可以使用merge 函数内部连接两个data.frames

tbl.df <-data.frame(table(data$start_station_id))
colnames(tbl.df)[1] <- "start_station_id"
data <- merge(data, tbl.df)

data.table

data.table::setDT(data)
data[, `Number of rows` := .N, by = start_station_id]

:= 是一个创建新列的data.table 函数,.N 给出当前组的行数,by 指定要分组的列。这会自动将Number of rows 列添加到data.table。 有关data.table 包的介绍,请查看vignette。 这个实现是最快的。

【讨论】:

    【解决方案2】:

    这种方法是可行的,但您不应该使用 data.frame 来放入新数据,因为您还不知道行数。只需使用一个列表并将其转换为最后的data.frame:

    stationData = list("station" = unique(c(data$start_station_id, data$end_station_id)), ##  Create a list of all stations
                       "starts" = c(),
    
    for(i in i:length(stationData$station)){
       s = stationData$station[i]
       stationData$starts[i] <- sum(data$start_station_id == s)
    }
    stationData = as.data.frame(stationData)
    

    在 for 循环结束时,两列的长度将相同,创建此数据不会有问题。

    不过,更简单的方法是使用 table() 函数,该函数自动计算起始站的数量,并且已经由 Abdessabour Mtk 提出。

    【讨论】:

      猜你喜欢
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 2020-10-11
      • 2022-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多