如果条件不满足,请在data.frame中引用上面的行

时间:2017-07-20 08:28:15

标签: r dataframe reference

使用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)

2 个答案:

答案 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)