重新编写data.frame并将值替换为第二个data.frame中最接近的值

时间:2018-07-19 01:43:08

标签: r dataframe

我有一个data.frame(df.x),它由1000行和10列组成。最后一列是每一行的类别/标签(即df.x$lbl)。

df.x <- data.frame(replicate(9,sample(0:100,1000,rep=TRUE)))
df.x$lbl <- (replicate(1,sample(0:15,1000,rep=TRUE)))

然后,我将此data.frame聚合到基于(df.x.agg)的“ lbl”列中。现在我有两个data.frame:

df.x.agg <- aggregate(df.x[, 1:ncol(df.x)], list(df.x$lbl), mean)
df.x.agg <- df.x.agg[,2:ncol(df.x.agg)]

我想做的是通过比较X1的每个值与{{1}中第一列的所有值来重写df.x中第一列df.x的每个值}},并将其替换为df.x.agg中具有最接近值的那一行的标签。应该为df.x.agg的每一列完成此操作。因此,输出将是一个新的df.x(即df.x),其中将填充标签而不是数字。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

我使用固定种子来生成样本数据,以确保可重复性。

# Sample data
set.seed(2017)
df.x <- data.frame(replicate(9,sample(0:100,1000,rep=TRUE)))
df.x$lbl <- (replicate(1,sample(0:15,1000,rep=TRUE)))

df.x.agg <- aggregate(df.x[, 1:ncol(df.x)], list(df.x$lbl), mean)
df.x.agg <- df.x.agg[,2:ncol(df.x.agg)]


df.x.new <- mapply(
    function(x, y) apply(outer(x, y, function(v, w) abs(v - w)), 1, which.min) - 1,
    df.x[, -ncol(df.x)], df.x.agg[, -ncol(df.x.agg)])
head(df.x.new)
#     X1 X2 X3 X4 X5 X6 X7 X8 X9
#[1,] 10 10  2  5  9 11  0 12  7
#[2,] 10 14  8  3 10  1  0  0  7
#[3,]  0 14 11  3 10  1  8 12  0
#[4,]  1 14  9 10 12  1  5 12  0
#[5,] 10  3 11  5  9  1  2 12  7
#[6,] 10  0 11 11  9  0  0 12  7

对于df.x的每个条目,df.x.new将来自同一列的最近条目的lbl存储在df.x.agg中。我将“最接近”定义为两个值之间的绝对差值

反复检查:输入条目df.x.new[1, 1] = 10;我们确认对于df.x$X1[1] = 93df.x.agg$X1中带有lbl = 10的条目确实是“最近的”

df.x.agg$lbl[which.min(df.x$X1[1] - df.x.agg$X1)]
#[1] 10