首页 > 解决方案 > 对数据帧的相等值/行求和/计数

问题描述

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

我正在尝试制作第二个数据框,其中包含为每个站点重新排列的所有信息。因此,例如,如果在第一个数据帧中有 50 个行程的 start_station_id == 12,那么在 station_id 12 下的第二个数据帧的“开始”列将等于 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 循环?任何提示都会非常有帮助

标签: rfor-loop

解决方案


该方法是可行的,但您不应该使用 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 提出。


推荐阅读