获取R中每行的最后一个非零列名,并创建一个单独的列

时间:2018-07-26 16:07:26

标签: r

我有以下数据集

ID  Jan Feb March April May Jun
ABC 0   1    0      0   2   1
DEF 1   2    1      0   0   0
GHI 0   10   0      1   0   0
JKI 0   0    2      0   0   0
MNO 3   0    0      0   0   0

我想得到这样的东西

ID  Jan Feb March   April   May Jun LastMonth
ABC 0   1    0      0       1   1   Jun
DEF 1   1    1      0       0   0   March
GHI 0   1    0      1       0   0   April
JKI 0   0    1      0       0   0   March
MNO 1   0    0      0       0   0   Jan

我编写了以下代码来获取每一行的最后一个非零元素的索引,但这本身存在太多问题。

  df$last <- apply(df, 1, function(x) tail(x[x > 0.00001],1))

我将新列作为

character(0)
character(0)
character(0)
2
character(0)

我不确定为什么要获得此列而不是实际数字

2 个答案:

答案 0 :(得分:4)

您可以一行执行以下操作:

# get name of most recent month
df$Last_Month <- apply(df[-1], 1, function(x) last(colnames(df[-1])[x==1]))

答案 1 :(得分:4)

我们可以使用max.col来获取每一行的逻辑矩阵最大值(df1[-1] != 0)的列索引,并使用它来获取列名

df1$LastMonth <- names(df1)[-1][max.col(df1[-1] != 0, 'last')]
df1$LastMonth
#[1] "Jun"   "March" "April" "March" "Jan"  

数据

df1 <- structure(list(ID = c("ABC", "DEF", "GHI", "JKI", "MNO"), Jan = c(0L, 
1L, 0L, 0L, 3L), Feb = c(1L, 2L, 10L, 0L, 0L), March = c(0L, 
1L, 0L, 2L, 0L), April = c(0L, 0L, 1L, 0L, 0L), May = c(2L, 0L, 
0L, 0L, 0L), Jun = c(1L, 0L, 0L, 0L, 0L)), .Names = c("ID", "Jan", 
"Feb", "March", "April", "May", "Jun"), class = "data.frame", 
row.names = c(NA, -5L))