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