R 将第三列中的列值替换为“按系数平均y”
我有一个响应为y的数据帧。数据框中有一列具有53个因子级别X0。在两个级别上有300个列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
- 0-表示结果中不包括该列
- 1-表示要包括的此行
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