R如何添加一个dataframe列,该列的值是从其他行中的其他列值派生的?

R如何添加一个dataframe列,该列的值是从其他行中的其他列值派生的?,r,R,这个问题的答案可能很简单,但我似乎无法回避 我有一个数据集:年份、治疗、治疗水平和一个值(产量)。处理方法包括矿物(肥料)、肥料和堆肥。我想添加一个具有引用值的列。该参考值应为给定年份和矿物处理水平的值(产量)。例如: DF1<-data.frame(treatment = c("mineral","mineral", "manure","manure","compost","compost","mineral","mineral", "manure","manure", "compost

这个问题的答案可能很简单,但我似乎无法回避

我有一个数据集:年份、治疗、治疗水平和一个值(产量)。处理方法包括矿物(肥料)、肥料和堆肥。我想添加一个具有引用值的列。该参考值应为给定年份和矿物处理水平的值(产量)。例如:

DF1<-data.frame(treatment = c("mineral","mineral", "manure","manure","compost","compost","mineral","mineral", "manure","manure", "compost","compost"),
            year = c("1990","1990","1990","1990","1990","1990", "1991","1991","1991", "1991","1991","1991"),
            level = c("1","2","1","2","1","2","1","2","1","2","1","2"),
            value = c("1","2","1.1","2.2","1.3","2.5","3","4","3.2","4.4","3.5","4.8"))

DF1
 treatment year level value
mineral 1990     1     1
mineral 1990     2     2
 manure 1990     1   1.1
 manure 1990     2   2.2
compost 1990     1   1.3
compost 1990     2   2.5
mineral 1991     1     3
mineral 1991     2     4
 manure 1991     1   3.2
 manure 1991     2   4.4
compost 1991     1   3.5
compost 1991     2   4.8  
DF1你可以试试

 res <- do.call(rbind,
         lapply(split(DF1, list(DF1$year, DF1$level), drop=TRUE),
                function(x){x$ref <- x$value[x$treatment=='mineral']
                  x}))
 indx <- as.numeric(gsub(".*\\.", "", row.names(res)))
 res1 <- res[order(indx),]
 row.names(res1) <- NULL
 res1

你能给我看一下预期的
ref
列吗好的,那么,我一定是误解了这个问题。但是,我认为这可以不用循环解决。是的,我也这么认为,只是不知道如何…无论如何,我更新了,我想这一次它应该可以工作。好的。谢谢我改进了这个问题。谢谢你的思考。这个建议对这个小示例数据集很有效,但我认为更为偶然(仍然是个好主意),但我有一个包含数百个数据点的集合,有许多不同的年份、处理方法和级别,因此我想找到一种方法,重定向到某一年矿物处理的值,并将其添加到ref列中。我现在考虑先使用函数ave()进行分组。比如:DF1$ref_minN对不起,我的第一个问题没有说得更清楚,它似乎比我想象的更难解释。在本例中,Akrun的ref列是正确的,但不适用于大型数据集更新:参考值不一定是最小值(仅在本例中是巧合),它应该是给定年份和级别的处理矿物的值。我的一位同事以循环的形式给了我答案,我会把它贴在这里
 library(data.table)
 DT <- as.data.table(DF1)
 DT1 <- DT[treatment=='mineral', list(ref=value), by=list(year, level)]
 DT[,indx:=1:.N]
 setkey(DT, year, level)
 DT[J(DT1)][order(indx),][,indx:=NULL][]
 #    treatment year level value ref
 #1:   mineral 1990     1     1   1
 #2:   mineral 1990     2     2   2
 #3:    manure 1990     1   1.1   1
 #4:    manure 1990     2   2.2   2
 #5:   compost 1990     1   1.3   1
 #6:   compost 1990     2   2.5   2
 #7:   mineral 1991     1     3   3
 #8:   mineral 1991     2     4   4
 #9:    manure 1991     1   3.2   3
#10:    manure 1991     2   4.4   4
#11:   compost 1991     1   3.5   3
#12:   compost 1991     2   4.8   4