使用data.frame colors
:
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)
答案 0 :(得分:4)
考虑到您的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
颜色的更改索引,然后使用使用最后一个向量对原色进行子集化。
答案 1 :(得分:3)
这是“最后一次观察结果”的一个很好的用例,即来自na.locf
包的zoo
函数。
首先获取原色所在位置的索引:
idx <- colors$level == "Primary"
然后,将这些原色分配给新列,将其他行保留为缺失值:
colors[idx, "primary"] <- colors$color[idx]
现在您可以使用我上面描述的功能来填充原色的NA:
colors$primary <- zoo::na.locf(colors$primary)