R中Parent_ID和扩展名上的列链接问题

时间:2018-10-14 11:08:08

标签: r dplyr

我有一个文件,其中包含一些Order_ID及其Externsion_ID(如果存在)。新订单可以是新订单,也可以是现有Order_ID的扩展或现有扩展的扩展。

我的问题是添加一个名为Parent_ID的新列,该列标记了Order_ID的根。

请找到以下预期输出:

enter image description here


以下是可复制的输入。

train = pd.read_csv('data/train.csv', dtype = dtypes)
test = pd.read_csv('data/test.csv')

test.head()

X = train.iloc[:10000, 3:-1].values
y = train.iloc[:10000, -1].values

sc = StandardScaler()
X = sc.fit_transform(X)

#pca = PCA(0.95)
#X = pca.fit_transform(X)

d_train = lgb.Dataset(X, label=y)
params = {}
params['learning_rate'] = 0.003
params['boosting_type'] = 'gbdt'
params['objective'] = 'binary'
params['metric'] = 'binary_logloss'
params['sub_feature'] = 0.5
params['num_leaves'] = 10
params['min_data'] = 50
params['max_depth'] = 10

num_round = 10
clf = lgb.train(params, d_train, num_round, verbose_eval=1000)

X_test = sc.transform(test.iloc[:100,3:].values)

pred = clf.predict(X_test,  num_iteration = clf.best_iteration)

1 个答案:

答案 0 :(得分:1)

以下是基于igraph的解决方案:

library(igraph) # 1.2.1

v <- data.frame(name = unique(unlist(df1)), stringsAsFactors = FALSE)
v <- v[!is.na(v$name), ]

g <- graph_from_data_frame(df1[!is.na(df1$Extension_Of), 2:1], vertices = v)

df1$Parent_ID <- sapply(df1$Order_ID, function(oid){
    n <- ego(g, order = nrow(df1), oid, mode = 'in')[[1]]
    nin <- lapply(n, function(x){ego(g, order = nrow(df1), x, mode = 'in')[[1]]})
    root <- n[lengths(nin) == 1]$name
})

df1[df1$Parent_ID == 'SL384', ]
#     Order_ID Extension_Of Parent_ID
# 113    SL384         <NA>     SL384
# 138  SL11995      SL10046     SL384
# 170  SL10046        SL384     SL384

此答案的灵感来自this answerthis function

基本原理:df1中没有NA的每条线都可以视为图形中的一条边。如果B是A的扩展,则边A->B。如果C是B的扩展,则得到B-> C。然后可以将该问题表述为:对于每个节点(Order_ID),找到其根节点。对于C,由于(A-> B-> C),其根节点为A。

在上面的代码中,对于Order_IDego查找直接或间接位于其上游(包括自身)的所有节点。在这些上游节点中,我们可以确定根节点是没有其他上游节点的根节点。