从数据框中的一行向后查找匹配项

时间:2018-08-14 06:39:07

标签: r

我有一个存储分层数据的数据框,其一部分如下所示:

print(data)

 level           Name
   1         WRG ASM ENGINE
   2         MOUNT CLAMP
   3         Carbon Steel
   4         Carbon
   3         PA
   4         F-Fibre

现在说我想找到名称为“ Carbon”的行的直接父级。我目前正在使用以下代码:

1。找到Carbon的级别值,直接父级将具有级别    值比Carbon少1。

    level_carbon <-data[which(data$Name=="Carbon"),"level"]

2。在数据框中查找碳的位置

    row_num_carbon <-which(data$Name=="Carbon)

3。获取所有可能的直系父母的索引

    Parents_Carbon_index <- which(data$level==level_carbon-1 )

4。直接父级的索引将小于碳的索引,并且将是    在数据框中距离碳最近

   Act_Parent_Carbon <- (which.min(Parents_Carbon_index < row_num_carbon))-1 
   Carbon_Parent <- data[Act_Parent_Carbon ,"Name"]

   print(Carbon_Parent)
   "Carbon Steel"

上面的代码可以达到目的,但是我正在寻找一个更短的代码,它看起来更干净并且执行时间更少。

2 个答案:

答案 0 :(得分:0)

unset($fields['shipping']['shipping_first_name']);
unset($fields['shipping']['shipping_last_name']);
unset($fields['shipping']['shipping_state']);

您可以创建一个函数来查找给定项的父项:

# create an identifier for order
data <- tibble::rowid_to_column(data)

# update following up @r2evans' comment: 
# below is a base R option to get rowids since rowid_to_column requires tibble
# data$rowid <- seq_len(nrow(data))

# conditions: one level up + before the given row + closest to given row
tail(data$Name[data$level == data$level[data$Name == "Carbon"] - 1 & data$rowid < data$rowid[data$Name == "Carbon"]], 1)

答案 1 :(得分:0)

with(data,Name[(s<-which(level==level["Carbon"==Name]-1))[max(s<which("Carbon"==Name))]])
[1] "Carbon Steel"