2017-05-03 80 views
0

我有一个每个月的降水位置和值的表格。R中列的名称

我需要添加一个新列名称的每个位置有最大降水量的月份。

我想这样做:

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

感谢

enter image description here

+2

你需要应用'(DF,1,功能(我)的名字(我[which.max(I)))'。但是,请检查函数'max.col' – Sotos

+2

您可以让您的答案可重现吗?这会让你更容易帮助你,特别是为你提供替代解决方案。 –

回答

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的答案非常优雅。

+0

这正是我需要:) –

4

最好的办法是通过max.col。你应该总是避免apply上data.frames,

names(rainfall)[max.col(rainfall[3:11])] 
+2

不错,不知道这个功能。 R中总是有更多的东西要学习:)。 –