DF = structure(list(a = c(1L, 2L, 5L), b = c(2L, 3L, 3L), c = c(3L, 1L, 2L)), .Names = c("a", "b", "c"), row.names = c(NA, -3L), class = "data.frame")
a b c
1 2 3
2 3 1
5 3 2
如何创建其他列,每个列包括行最小,中间和最大列的名称或索引,如下所示?
a b c min middle max
1 2 3 a b c
2 3 1 c a b
5 3 2 c b a
答案 0 :(得分:4)
一种方法是使用Data <-cbind(Data, (Data$T0 + Data$Recovery_rate * Data$Disturbance_freq)- Data$Impact *
(Data$T0+Data$Recovery_rate * Data$Disturbance_freq)/100)
Data <-cbind(Data, (Data$T1 + Data$Recovery_rate * Data$Disturbance_freq)-Data$Impact *
(Data$T1+Data$Recovery_rate * Data$Disturbance_freq)/100)
循环遍历行,按指示的顺序返回列名称:
apply
此解决方案假设您有三列(因此中间是第二大列)。如果不是这种情况,您可以通过以下修改推广到任意数量的列:
cbind(DF, t(apply(DF, 1, function(x) setNames(names(DF)[order(x)],
c("min", "middle", "max")))))
# a b c min middle max
# 1 1 2 3 a b c
# 2 2 3 1 c a b
# 3 5 3 2 c b a
答案 1 :(得分:3)
正如OP提到的关于data.table
,这是data.table
的一种方式。将'data.frame'转换为'data.table'(setDT(DF)
),按行序列分组,我们unlist
数据集,order
值,将其用作索引订购列名,通过分配(转换为list
后)创建三列。
library(data.table)
setDT(DF)[, c('min', 'middle', 'max') :=
as.list(names(DF)[order(unlist(.SD))]) ,1:nrow(DF)][]
# a b c min middle max
#1: 1 2 3 a b c
#2: 2 3 1 c a b
#3: 5 3 2 c b a