【问题标题】:Re-writing a data.frame and replacing the values with their closest in a second data.frame重写 data.frame 并将值替换为第二个 data.frame 中最接近的值
【发布时间】:2018-07-19 01:43:07
【问题描述】:

我有一个由 1000 行和 10 列组成的 data.frame (df.x)。最后一列是每一行的类别/标签(即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.frames:

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 中第一列X1 的每个值,方法是将df.x 的每个值与df.x.agg 中第一列的所有值进行比较,并将其替换为标签df.x.agg 中具有最接近值的那一行。这应该针对df.x 的每一列进行。所以输出将是一个新的df.x(即new.df.x),其中填充了标签而不是数字。

非常感谢您的帮助。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

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

    # 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$X1lbl = 10 中的条目确实是“最接近的”

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-15
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      相关资源
      最近更新 更多