我在r
中有以下数据框 no no1 no2 no3 no4
A 0 34 54 21
B 43 0 23 65
C 56 23 0 0
我想按降序打印列名的所有非零值(前3)。期望的数据帧将是
no no1 no2 no3 no4 names
A 0 34 54 21 no3 no2 no1
B 43 0 23 65 no4 no1 no3
C 56 23 0 0 no1 no2
我在R中使用以下函数在名称列中打印数组。我不能做的是按降序排序。
simplify2array(apply(df[2:5],1,function(x) paste(names(df[2:5])[x!=0],collapse="")))
如何修改上面的函数以适应降序排序行并只采用前3个值
答案 0 :(得分:1)
我们可以apply
与MARGIN=1
一起循环使用sort
下降的非零元素head
,我们可以将第一个&# 39; N'元素(根据OP的评论),得到names
,然后paste
一起
df1$names <- apply(df1[-1], 1, FUN = function(x)
paste(names(head(sort(x[x!=0], decreasing = TRUE), 3)), collapse=" "))
df1
# no no1 no2 no3 no4 names
#1 A 0 34 54 21 no3 no2 no4
#2 B 43 0 23 65 no4 no1 no3
#3 C 56 23 0 0 no1 no2