我有一个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
),其中将填充标签而不是数字。
非常感谢您的帮助。
答案 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] = 93
,df.x.agg$X1
中带有lbl = 10
的条目确实是“最近的”
df.x.agg$lbl[which.min(df.x$X1[1] - df.x.agg$X1)]
#[1] 10