这是我的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])]]
我可以使用第一种或最后一种类型的打结器。非常感谢您的帮助!
答案 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
这意味着第二大。