R 将第三列中的列值替换为“按系数平均y”

R 将第三列中的列值替换为“按系数平均y”,r,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

我有一个响应为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)]
}
现在我意识到我真的想要X0每一级的平均值。也就是说,对于X0==a的所有值,我想得到当X10==1时的平均值。这会生成我想要的数字

a <- aggregate(trainf$y, by=list(trainf$X10, train_test$X0), na.rm = TRUE, 
     mean)
第1组为X10-0中的水平,第1组为唯一可能的水平

第2组为X0因子-因子为字符/因子,但变为数字

第3组是期望的平均值

我尝试了很多方法(在这两行代码上花了大约16个小时),但无法将a数据表返回到trainf中以代替1值。使事情复杂化的是,一些X0级别现在只有NA值,所以我的“a”数据表在第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级别有两个使用it值-第二行和第三行-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和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

thevars我不完全确定我是否得到了您想要的,但似乎您希望
group3
列作为一个单独的列出现在您的主数据框中,对吗

有几种方法可以做到这一点,我个人喜欢
data.table
。我们将调用输出列
mean

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

因此,我们完全在一个表中进行计算,而不是先提取数据,然后再尝试将其放回原处。

您的示例不可复制;i、 例如,当我试图为它编写代码时,我不能完全确定我给出了正确的答案,因为您想要的结果假设我无法访问数据

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

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"

问题是,每列中的答案都是相同的,如果我输入了
{column}[({column}[I]==1]),我将阅读更多关于这个站点的信息,这样我就可以输入数据表的示例。当我使用您编写的代码时,会在数据表中添加一个名为mean的新列。每行是所有行的y平均值,系数为X0。它与X10值无关。也就是说,我得到了与X13、X100等相同的结果。我还希望平均值替换X10中的0和1,而不是表中的新列。-0值仍然为0,1值现在为平均值。希望我能在这里得到一张小桌子-谢谢你的努力。当我把这个放在我的脚本中时,我收到了一条我讨厌的消息-在过去的几天里经常看到它。。。。。
[.data.table
(trainf,j)中的错误:j(在[…]中的第二个参数)是单个符号,但找不到列名“j”。可能您想要的是DT[,…j]或DT[,j,with=FALSE)。data.frame与data.frame的这种差异是经过深思熟虑的,并在常见问题解答1.1中进行了解释。我可以做[[I]]大多数情况下,我都在修复这个问题,但在R太新了,无法修复您的问题。我将尝试获取一个实际示例-感谢您的回答。不,我使用的是base R,正是因为data.table包和DT命令给了我无法解释的错误。删除了我所有的库。仅放置库(base)-想想看,这只会让我得到R基-仍然会得到一条错误消息。
[.data.table
(trainf,i,j):j(在[…]内的第二个参数)是一个符号,但找不到列名“j”。也许您想要的是DT[,…j]或DT[,j,with=FALSE]。此与data.frame的差异是经过深思熟虑的,并在常见问题解答1.1中进行了解释。>我的代码中没有使用
data.table
命令,因此我不确定您的问题是什么,但它已成功运行。我正在使用fread(“../input/trainf.csv”)读取脚本中的trainf。将其更改为read.table-trainf在尝试完成这段小代码将近30个小时后,我认为是时候在Excel中艰难地完成这段代码并继续前进了。到目前为止,我可以在Excel中以缓慢和艰难的方式完成十几次。好的-30分钟为8000x370表编写并运行Excel宏。它运行有点慢,但有点慢ure打败了在R中花了30个小时却没有任何东西展示的局面——吉米有很多东西要学!!!!
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
library( data.table )
setDT( trainf )[ , mean := mean( y, na.rm = TRUE ), by = .( X10, X0 ) ]
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"
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