列名称,每行具有第二高值

时间:2016-07-10 22:25:51

标签: r data.table

这是我的data.frame / data.table

   library(data.table)
    df<- fread('

    A B C D SecondLargest
    1 3 2 4      B
    6 3 5 4      C
    7 3 7 1      A
    6 9 3 2      A
    ')

我正在尝试在我的“SecondLargest”所希望的列中提取具有第二大值(并行)的列名。

我尝试过没有成功。

 df[,SecondLargest:= colnames(df[,c(1:4),
with=FALSE])[apply(df[,c(1:4),with=FALSE],1,function(x) 
x[rank(1/x, ties.method='first')==2])]] 

我可以使用第一种或最后一种类型的打结器。非常感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我们可以尝试使用var regions = { region1:[1540, 1130, 1580, 1105], region2:[2010, 1168, 2305, 4102], region3:[2450, 1847, 2710, 2391], region4:[1845, 1491, 1284, 1575], region5:[2120, 1767, 1599, 3888] }; var totalPerRegion = 0, quarter1 = 0, quarter2 = 0, quarter3 = 0, quarter4 = 0; for(region in regions){ // calculate the sales per quarters; quarter1 += regions[region][0]; quarter2 += regions[region][1]; quarter3 += regions[region][2]; quarter4 += regions[region][3]; } console.log('quarter 1:', quarter1); console.log('quarter 2:', quarter2); console.log('quarter 3:', quarter3); console.log('quarter 4:', quarter4);。在这里,我对数据集进行了子集化以删除预期的输出,在“rn”分组后,将行号编号列'rn',melt创建为'long'格式',melt'降序' ,选择'变量'的第二个元素,并将其分配(order)为'df'中的“SecondLargest”列。

:=

如果我们需要第一个领带,

df[, SecondLargest := melt(df[, -5, with = FALSE][, rn := 1:.N], id.var= 'rn')[, 
         variable[order(-value)][2] , rn]$V1]
df
#   A B C D SecondLargest
#1: 1 3 2 4             B
#2: 6 3 5 4             C
#3: 7 3 7 1             C
#4: 6 9 3 2             A

答案 1 :(得分:0)

我们也可以这样做:

df$SecondLargest <- colnames(df)[apply(df,1,function(x)which(x==sort(x,partial=3)[3])[1])]

# A B C D SecondLargest
# 1 1 3 2 4             B
# 2 6 3 5 4             C
# 3 7 3 7 1             A
# 4 6 9 3 2             A
partial的{​​{1}}参数很少,因为它不会对所有元素进行排序,而是根据我们的需要进行部分排序。 sort这意味着第二大。