在 R 中,我試圖根據資料框中存在的列生成一列正態分布的隨機值。由于我正在使用的列中有 NA,因此新列中會回傳 NA。 有沒有辦法可以忽略這些 NA?
我使用內置的“空氣質量”資料集作為一個虛擬示例來說明我的問題,因為它包含 NA。
示例代碼:
> airquality$random <- rnorm(n = nrow(airquality), mean = (50 airquality$Ozone*1.2 airquality$Solar.R*0.5 airquality$Wind*3 airquality$Temp*0.2), sd = 5)
Warning message:
In rnorm(n = nrow(airquality), mean = (50 airquality$Ozone * 1.2 :
NAs produced
> head(airquality)
Ozone Solar.R Wind Temp Month Day random
1 41 190 7.4 67 5 1 222.5487
2 36 118 8.0 72 5 2 191.8911
3 12 149 12.6 74 5 3 188.5913
4 18 313 11.5 62 5 4 273.7623
5 NA NA 14.3 56 5 5 NaN
6 28 NA 14.9 66 5 6 NaN
第 5 行和第 6 行的“隨機”列中列出了 NaN。我希望忽略“NA”值(NA 可以在任何列中),因此第 5 行的值為 100.22697*,第 6 行的值為 143.1274*
*這些值是通過從代碼中手動洗掉 NA 列獲得的,但如果我有一個包含數千行和數十列的資料集,則這是不切實際的。
包含na.rm = TRUE在該mean = ()部分中會回傳錯誤訊息:
> airquality$random <- rnorm(n = nrow(airquality), mean = (50 airquality$Ozone*1.2 airquality$Solar.R*0.5 airquality$Wind*3 airquality$Temp*0.2, na.rm = TRUE), sd = 5)
Error: unexpected ',' in "airquality$random <- rnorm(n = nrow(airquality), mean = (50 airquality$Ozone*1.2 airquality$Solar.R*0.5 airquality$Wind*3 airquality$Temp*0.2,"
如果我把它放在na.rm = TRUE該部分的末尾rnorm(),它會回傳一條不同的錯誤訊息:
> airquality$random <- rnorm(n = nrow(airquality), mean = (50 airquality$Ozone*1.2 airquality$Solar.R*0.5 airquality$Wind*3 airquality$Temp*0.2), sd = 5, na.rm = TRUE)
Error in rnorm(n = nrow(airquality), mean = (50 airquality$Ozone * 1.2 :
unused argument (na.rm = TRUE)
uj5u.com熱心網友回復:
列中有NA元素。一個選項是將 轉換NA為 0,然后在計算mean值時將其用作任何算術運算 ( ) 并NA回傳NA。此外,na.rm = TRUEin OP 的代碼什么也不做,因為它是函式的引數,mean而不是引數meanrnorm
tmp <- replace(airquality, is.na(airquality), 0)
rnorm(n = nrow(tmp), mean = (50 tmp$Ozone*1.2
tmp$Solar.R*0.5 tmp$Wind*3 tmp$Temp*0.2), sd = 5)
-輸出
[1] 230.54274 175.63684 191.09352 272.75306 108.56648 147.00571 263.74854 176.54437 138.34712 193.08597 91.91993 244.38106 246.75853 254.24543
[15] 151.91976 278.17564 291.79558 166.25150 291.45414 124.37602 91.79503 285.40843 107.71572 180.18917 133.19906 230.15677 85.62659 135.79484
[29] 290.33483 328.01940 268.59444 233.47771 240.75695 231.80327 182.09191 204.27378 239.15409 197.93795 222.74681 338.83640 305.89129 226.42353
[43] 221.24226 190.21195 269.85521 260.70751 223.62116 319.93789 135.87652 171.82266 174.49938 159.01576 102.26742 128.54807 211.20653 147.96291
[57] 147.09487 118.30181 137.67034 128.21919 155.11839 380.05157 276.10527 247.92156 142.26157 249.46309 308.70804 299.31816 344.92304 341.46871
[71] 276.41410 162.72329 255.91151 224.55619 253.61126 139.57793 284.49149 277.79043 313.16401 273.82248 284.77515 109.29104 219.85529 249.98464
[85] 331.40262 334.25997 155.60046 209.86921 308.24376 283.52677 287.17854 289.04658 173.97213 135.25243 148.04647 180.20284 135.46867 159.87413
[99] 354.59991 317.06474 324.99885 207.30217 176.03234 243.66570 262.85251 251.59681 127.67214 161.26074 174.00305 177.45175 247.33476 246.72993
[113] 262.35549 136.78726 226.31141 259.75610 397.83067 293.34740 156.55135 289.65580 322.11876 301.68719 280.98863 297.88105 276.24682 251.60182
[127] 290.87347 188.69579 200.89883 246.30607 242.00302 232.00063 250.95042 279.32326 268.79634 235.51977 130.42808 170.68919 258.11289 241.38551
[141] 122.56174 239.76333 206.85573 230.98431 120.80214 214.62313 126.46720 135.36000 213.49774 178.97910 216.34848 175.17351 231.16300
另一種選擇是將列分別與權重相乘,然后得到rowSums我們可以使用的總和na.rm = TRUE
mn <- rowSums(transform(airquality, Ozone = Ozone * 1.2,
Solar.R = Solar.R * 0.5, Wind = Wind * 0.3,
Temp = Temp * 0.2)[c("Ozone", "Solar.R", "Wind", "Temp")], na.rm = TRUE)
rnorm(n = nrow(airquality), mean = mn, sd = 5)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/430476.html
上一篇:根據id序列展開列
