在第三列

时间:2017-06-30 03:42:46

标签: r

我的数据框的响应为y。数据框中有一列有53个因子级别X0。两个级别有300列。

  • 0 - 表示该列不包含在结果中。

  • 1 - 表示要包含此行。

数据表是trainf并且有8000多行

y     X0    X10  X11  X12  X13  X14 ..... X300
55.2   a     0    1    0    0    1          0
45.2   a     0    0    1    1    0          0
95.0   b     1    0    0    0    0          1
105.0  c     1    0    0    0    0          0

最初我想只用平均值替换X10 ... X300中的1个值。

for (i in 3:298) {
a <- tapply(trainf$y, trainf[,i] , na.rm = TRUE, mean)
trainf[,i] <- trainf[,i]*a[(2)]
}

这很好 - X10中1的所有值都被53.0取代,这是X10 == 1时的平均值,等等通过X300。但结果并没有产生所需的模型。原始值和修订值的lm()给出了相同的答案。

y     X0    X10  X11    X12   X13  X14 ..... X300
55.2   a     0   46.2    0    0    22.8       0
45.2   a     0    0     49.0  63.5 0          0
95.0   b    53.0  0      0    0    0          95.0
105.0  c    53.0  0      0    0    0          0

现在我意识到我真的想要X0每个级别的平均值。也就是说,对于X0 == a的所有值,我想在X10 == 1时得到均值。这会生成我想要的数字。

a <- aggregate(trainf$y, by=list(trainf$X10, train_test$X0), na.rm = TRUE, 
     mean)

缺少下一行是我需要帮助的地方

trainf?????? <- ????

这为我提供了一个包含三列的数据框

group 1   group 2   group 3
 0        1         114.44992
 0        2         152.17
 .....

组1是在X10中看到的水平 - 0和1是唯一可能的

组2是X0因子 - 因子是字符/因子但变成数字

组3是所需的平均值

我尝试了很多东西(在这几行代码上花了大约16个小时)但是不能将数据表放回trainf代替1值。更复杂的是,一些X0级别现在只有NA值,所以我的&#34; a&#34;数据表在第3组中有一些我需要处理的NaN。

R和这个网站都很新 - 所以我希望能给你足够的帮助。我认为它应该是for循环中的一个简单的单行,类似于我在X10的第一次转换中使用的...我看到很多关于替换列中的值的问题但没有包括替换掉另一个数据帧的问题。不知道如何提供一个小的可行数据集。

启动表的更好示例

    y       X0  X10 X11 X12 X13 X14 X15 X16
    104.07  aj  0   0   0   0   1   0   0
    98.16   aj  1   0   0   0   1   0   0
    101.44  aj  1   0   0   0   1   0   0
    119.44  ap  0   0   0   0   0   1   0
    118.24  aj  0   0   0   0   1   0   0
    98.84   aj  0   1   0   1   1   0   0
    100.38  aj  0   1   0   0   1   0   0
    105.15  aj  0   0   0   0   1   0   0
    102.46  aj  0   0   0   1   1   0   0
    99.08   aj  0   0   0   0   0   0   0
    102.89  aj  0   0   0   0   1   0   0
    134.43  aa  0   0   1   0   0   0   0
    101.26  aj  0   0   1   0   0   1   0
    114.46  ap  0   0   0   0   0   1   0
    112.38  ap  0   0   0   0   0   1   0
    111.77  ap  0   0   0   0   0   1   0
    104.32  aj  0   0   0   0   1   0   0
    111.08  ap  0   0   0   0   0   1   0
    99.48   aj  0   0   0   0   1   0   0
    102.7   aj  0   0   0   0   0   0   0
    100.56  aj  0   0   0   0   1   0   0
    112.49  ap  0   0   0   0   0   1   0

在第X10列 - X0级别aj有两个使用它的值 - 第二行和第三行 - X10的平均y将是(98.16 + 101.44)/ 2 = 99.8

所以成功处理X10表后会是

    y       X0  X10
    104.07  aj  0
    98.16   aj  99.8
    101.44  aj  99.8
    119.44  ap  0
    118.24  aj  0
    98.84   aj  0
    100.38  aj  0
    .....

X11还有两个aj - 98.84&amp; 100.38 =平均值99.61

    y   X0      X10     X11
    104.07  aj  0       0
    98.16   aj  99.8    0
    101.44  aj  99.8    0
    119.44  ap  0       0
    118.24  aj  0       0
    98.84   aj  0       99.61
    100.38  aj  0       99.61
    105.15  aj  0       0
    102.46  aj  0       0
    99.08   aj  0       0

X12有一个aa和一个aj - 所以意味着y值

    y     X0    X10     X11    X12
    104.07  aj  0       0       0
    98.16   aj  99.8    0       0
    101.44  aj  99.8    0       0
    119.44  ap  0       0       0
    118.24  aj  0       0       0
    98.84   aj  0       99.61   0
    100.38  aj  0       99.61   0
    105.15  aj  0       0       0
    102.46  aj  0       0       0
    99.08   aj  0       0       0
    102.89  aj  0       0       0
    134.43  aa  0       0       134.43
    101.26  aj  0       0       101.26
    114.46  ap  0       0       0
    112.38  ap  0       0       0
    111.77  ap  0       0       0

希望更好地定义文件 - 我不清楚如何为您提供文件。

更改我在文件中读取的内容后,运行的代码会运行。但有些答案错了。看起来tempvalues没有保留他们应该的所有数字 - 他们似乎只持有最后一个有效的X0和X ??匹配。

thevars <- names(trainf)
k <- length(thevars)
n <- length(trainf$y)
for (i in 1:n) {
  for (j in 3:k) {
    if (trainf[i, j] == 1) {
    tempvalues <- trainf[((trainf$X0 == trainf$X0[i]) & (trainf[, j] == 1)), "y"]
    trainf[i, j] <- mean(tempvalues)
    }
  }
}

    y       X0  X10     X11   X12       X13      X14           X15
    104.07  aj  0       0       0       0        102.9991667    0
    98.16   aj  99.8    0       0       0        102.9018182    0
    101.44  aj  101.44  0       0       0        103.376        0
    119.44  ap  0       0       0       0        0              113.6033333
    118.24  aj  0       0       0       0        103.5911111    0
    98.84   aj  0       99.61   0       100.65   101.76         0
    100.38  aj  0       100.38  0       0        102.1771429    0
    105.15  aj  0       0       0       0        102.4766667    0
    102.46  aj  0       0       0       102.46   101.942        0
    99.08   aj  0       0       0       0        0              0
    102.89  aj  0       0       0       0        101.8125       0
    134.43  aa  0       0       134.43  0        0              0
    101.26  aj  0       0       101.26  0        0              101.26
    114.46  ap  0       0       0       0        0              112.436
    112.38  ap  0       0       0       0        0              111.93
    111.77  ap  0       0       0       0        0              111.78
    104.32  aj  0       0       0       0        101.4533333    0
    111.08  ap  0       0       0       0        0              111.785
    99.48   aj  0       0       0       0        100.02         0
    102.7   aj  0       0       0       0        0              0
    100.56  aj  0       0       0       0        100.56         0
    112.49  ap  0       0       0       0        0              112.49

2 个答案:

答案 0 :(得分:0)

我不完全确定我得到了你想要的东西,但似乎你希望group 3列在你的主数据框中,作为一个单独的列,是吗?

有几种方法,我个人喜欢data.table。我们将调用输出列mean

library( data.table )
setDT( trainf )[ , mean := mean( y, na.rm = TRUE ), by = .( X10, X0 ) ]

所以我们完全在一个表中进行计算,而不是首先提取事物然后再尝试将它们放回去。

答案 1 :(得分:0)

你的例子不可重复;也就是说,当我尝试为其编写代码时,我并不完全确定我会给出正确答案,因为您想要的结果会假定我无法访问的数据。

话虽如此,听起来你想要这个......

thetext <- "
y     X0    X10  X11  X12  X13  X14
55.2   a     0    1    0    0    1
45.2   a     0    0    1    1    0
95.0   b     1    0    0    0    0
105.0  c     1    0    0    0    0"

...更改为一个表格,其中位置i,j的1替换为给定{X0 == X0[i]column j == 1}的y的平均值。

正如rosscova所说,通过重新创建表格,这样做更容易。我的代码比他的代码多,但我只使用基数R:

trainf <- read.table(text = thetext, header = TRUE)
thevars <- names(trainf)
k <- length(thevars)
n <- length(trainf$y)

for (i in 1:n) {
  for (j in 3:k) {
    if (trainf[i, j] == 1) {
      tempvalues <- trainf[((trainf$X0 == trainf$X0[i]) & (trainf[, j] == 1)), "y"]
      trainf[i, j] <- mean(tempvalues)
    }
  }
}

trainf
> trainf
      y X0 X10  X11  X12  X13  X14
1  55.2  a   0 55.2  0.0  0.0 55.2
2  45.2  a   0  0.0 45.2 45.2  0.0
3  95.0  b  95  0.0  0.0  0.0  0.0
4 105.0  c 105  0.0  0.0  0.0  0.0

问题是,每列中的答案与我键入{column}[({column}[i] == 1)] <- y[i]的答案相同。这就是为什么一个可重复的例子如此重要的原因。