r语言 - 如果不满足条件,则在 data.frame 中引用上面的行



with a data.framecolors

colors <- data.frame(color=c("Red","Light Red","Dark Red","Blue","Turquise", "Dark Blue","Cyan"),
level=c("Primary",rep("Secondary",2),"Primary",rep("Secondary",3)),
stringsAsFactors = F)

我想添加一个新列primary.color其值以列中的值为条件level.如果级别=="原色",则颜色本身就是原色(你知道:红色,绿色,蓝色...对于其他颜色(在颜色中标记为次要(,应采用以前的值colors$primary.color指定主要颜色。像这样:

colors$primary.color <- ifelse(colors$level == "Primary", 
colors$color,
"Value of Primary Color above")

所需的输出应为:

colorsOutput <- data.frame(color=c("Red","Light Red","Dark Red","Blue","Turquise", "Dark Blue","Cyan"),
level=c("Primary",rep("Secondary",2),"Primary",rep("Secondary",3)),
primary.color=c("Red","Red","Red","Blue","Blue", "Blue", "Blue"),
stringsAsFactors = F)

考虑到您的data.frame已排序(首先是原色,然后是次要颜色(,您可以执行以下操作:

colors$primary.color <- colors$color[colors$level=="Primary"][cumsum(colors$level=="Primary")]
colors
#      color     level primary.color
#1       Red   Primary           Red
#2 Light Red Secondary           Red
#3  Dark Red Secondary           Red
#4      Blue   Primary          Blue
#5  Turquise Secondary          Blue
#6 Dark Blue Secondary          Blue
#7      Cyan Secondary          Blue

说明:你用colors$color[colors$level=="Primary"]取所有原色,然后使用cumsum来了解每种primary颜色的变化索引,然后用最后一个向量对原色进行子集化。

这是"最后观察结果"的一个很好的用例,即na.locfzoo包中的函数。

首先获取原色所在位置的索引:

idx <- colors$level == "Primary"

然后,将这些原色分配给新列,将其他行保留为缺失值:

colors[idx, "primary"] <- colors$color[idx]

现在您可以使用我上面描述的函数用原色填充 NA:

colors$primary <- zoo::na.locf(colors$primary)

最新更新