我有一个存储分层数据的数据框,其一部分如下所示:
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"
上面的代码可以达到目的,但是我正在寻找一个更短的代码,它看起来更干净并且执行时间更少。
答案 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"