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.locf
zoo
包中的函数。
首先获取原色所在位置的索引:
idx <- colors$level == "Primary"
然后,将这些原色分配给新列,将其他行保留为缺失值:
colors[idx, "primary"] <- colors$color[idx]
现在您可以使用我上面描述的函数用原色填充 NA:
colors$primary <- zoo::na.locf(colors$primary)