从每一行获取索引并与原始data.frame合并

use*_*910 3 r dataframe

我有以下data.frame

                   user_id 1 2 3 4 5 6 7 8 9
1           54449024717783 0 0 1 0 0 0 0 0 0
2          117592134783793 0 0 0 0 0 1 0 0 0
3          187145545782493 0 0 1 0 0 0 0 0 0
4          245003020993334 0 0 0 0 0 1 0 0 0
5          332625230637592 0 1 0 0 0 0 0 0 0
6          336336752713947 0 1 0 0 0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)

我想要做的是创建一个列(并删除1:9)并插入列名称,其中我有值1,每个用户只包含值为1的列,

如果我正在运行以下功能:

rowSums(users_cluster(users_cluster), dims = 1)
Run Code Online (Sandbox Code Playgroud)

它将汇总所有行值,但我需要使用列名复制它

PoG*_*bas 8

基础R解决方案:

data.frame(user_id = df[, 1],
           name = which(t(df[, -1] == 1)) %% (ncol(df) - 1))

#           user_id name
# 1  54449024717783    3
# 2 117592134783793    6
# 3 187145545782493    3
# 4 245003020993334    6
# 5 332625230637592    2
# 6 336336752713947    2
Run Code Online (Sandbox Code Playgroud)


mto*_*oto 5

这是另一个baseR选项:

inds <- which(df[,-1]!=0,TRUE)
df$newcol <- inds[order(row.names(inds)),][,2]

df[,c(1,11)]
#       user_id newcol
#1 5.444902e+13      3
#2 1.175921e+14      6
#3 1.871455e+14      3
#4 2.450030e+14      6
#5 3.326252e+14      2
#6 3.363368e+14      2
Run Code Online (Sandbox Code Playgroud)


akr*_*run 5

另一种方法max.col来自base R用户指定each user contain only column with the value 1

cbind(dat[1], ind = max.col(dat[-1], 'first'))
#          user_id ind
#1  54449024717783   3
#2 117592134783793   6
#3 187145545782493   3
#4 245003020993334   6
#5 332625230637592   2
#6 336336752713947   2
Run Code Online (Sandbox Code Playgroud)