如何解决对数据帧的相等值/行进行求和/计数
我有一个数据框,其中包含一堆单独的行程数据,以及每个行程的起点和终点站ID。
我正在尝试制作第二个数据帧,该数据帧将为每个工作站重新排列所有信息。因此,例如,如果第一个数据帧中有start_station_id == 12的50个行程,则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,:
replacement has 370 rows,data has 369
station_id是一个变量,其中包含每个唯一的工作站ID#,stationData $ starts是我要存储启动次数的位置。数据是我试图运行for循环的原始数据。
是否有更简单的方法来完成此操作,或者我只是在错误地编写了for循环?任何提示都将非常有帮助
解决方法
根据我对您的问题的了解,您正在尝试计算每个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
中,可以使用data.frames
函数将两个merge
内部合并
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。
这种实现是最快的。
该方法是可行的,但是您不应该使用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提出。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。