我有一个每个月降水的位置和值的表格。
我需要添加一个新列,其中包含每个位置具有最大降水量的月份的名称。
我试着这样做:
cbind(rainfall, max_month = apply(rainfall[,3:11],1,which.max))
但我只得到列的编号,我需要列的名称。 我明白了:
[1] 5 5 5 5 5 5 5 5 4 4 5 5 5 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
[59] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 4 5 5 4 5 5 5 5 5 5 5 5 5 5 5 5
[117] 5 5 5 5 5 5 5 5 5 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 4
我尝试添加名称功能和 colnames 功能'但他们俩都没有帮助。
names(apply(rainfall[,3:11],1,(which.max)))
谢谢
答案 0 :(得分:4)
最好的办法是通过max.col
。您应该始终避免使用apply
data.frames,
names(rainfall)[max.col(rainfall[3:11])]
答案 1 :(得分:1)
您可能需要以下内容:
names(rainfall[,3:11])[apply(rainfall[,3:11],1,which.max)]
通过对names(rainfall)
向量进行子集,您可以将列ID转换为名称。注意重复索引,例如c(5, 5, 5, 5)
重复提取的值。
使用dplyr
的替代方法:
library(dplyr)
library(mtcars)
mtcars %>%
gather(month, precip_value, disp, hp, drat, wt) %>%
group_by(gear) %>%
summarise(max_month = month[which.max(precip_value)])
请注意,此方法使用mtcars
数据集,因为您的示例不可重现。在这里,gear
将是您的电台ID。诀窍是使用gather
从宽格式到长格式重构数据,然后使用group_by
分割每个站点的数据,然后使用summarise
确定最大月份。只是值得深思,@sotos的答案非常优雅。