我有以下数据框:
id cluster username 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011
1 268672 Type 1 Vlaam 0 0 0 0 0 0 5896 18976 13552 20508 106939
2 351003 Type 2 WikiCleanerBot 0 0 0 0 0 0 0 17049 8468 22834 7470
2012 2013 2014 2015 2016
1 83874 97447 59677 88661 41133
2 11219 83245 28015 40464 25053
我需要创建一个最后一个变量,告诉我2001,2002 ... 2016系列中的哪个变量对于每一行包含系列的 max 。我写这段代码:
cluster$yearMod <- apply(cluster,1,function(x) {
years <- x[4:19]
as.numeric(names(years)[match(max(years),years)])
})
但是这给了我:
[1] 2015 2015
这绝对不是正确的值,即2011年和2013年。
你能帮助我吗?
答案 0 :(得分:1)
如果是max
元素,那么我们可以使用max.col
。使用grepl
(&#39; i1&#39;)创建数字列名称的逻辑索引,然后基于数据集&#39; i1&#39; (df1[i1]
)获取max
的每一行的max.col
值的索引,并使用它来获取相应的列名。
i1 <- grepl("[0-9]+$", names(df1))
df1$newVar <- names(df1)[i1][max.col(df1[i1], "first")]
df1$newVar
#[1] "2011" "2013"
如果我们使用apply
,则另一个选项是which.max
names(df1)[i1][apply(df1[i1], 1, which.max)]
#[1] "2011" "2013"
df1 <- structure(list(id = c(268672L, 351003L), cluster = c("Type 1",
"Type 2"), username = c("Vlaam", "WikiCleanerBot"), `2001` = c(0L,
0L), `2002` = c(0L, 0L), `2003` = c(0L, 0L), `2004` = c(0L, 0L
), `2005` = c(0L, 0L), `2006` = c(0L, 0L), `2007` = c(5896L,
0L), `2008` = c(18976L, 17049L), `2009` = c(13552L, 8468L),
`2010` = c(20508L,
22834L), `2011` = c(106939L, 7470L), `2012` = c(83874L, 11219L
), `2013` = c(97447L, 83245L), `2014` = c(59677L, 28015L),
`2015` = c(88661L,
40464L), `2016` = c(41133L, 25053L)), .Names = c("id", "cluster",
"username", "2001", "2002", "2003", "2004", "2005", "2006", "2007",
"2008", "2009", "2010", "2011", "2012", "2013", "2014", "2015",
"2016"), row.names = c("1", "2"), class = "data.frame")