r语言 - 二进制运算符 - log() 的非数字参数



当我尝试对数据集中的变量运行log(x)时,出现错误:

Error in oldat$gdp16 + 1 : non-numeric argument to binary operator

起初我认为原因是这些特定变量具有 NA,所以我决定像这样处理这个问题:

oldat$gdp16[oldat$gdp16 == "#N/A"] <- "NA"
oldat$gdp16LOG <- log(oldat$gdp16 + 1, na.rm=TRUE)

这并没有解决问题。

请在下面找到数据摘录作为示例。日志转换失败的变量是 gdp16:

structure(list(gdp16 = c("19469", "159049", "554861", "10546", 
"1208039", "390800", "37868", "11839", "32153", "47723", "467546", 
"15649", "1793989", "53241", "32218", "1535768", "250036", "11190993", 
"280091", "51339", "NA", "20154", "195305", "306900", "72343", 
"98614", "332928", "5010", "23338", "73001", "4671", "238678", 
"2465134", "14014", "14378", "3477796", "192691", "1056", "68664", 
"320881", "125817", "20304", "2274230", "932256", "418977", "304819", 
"317748", "1859384", "36375", "14057", "4949273", "137278", "70875", 
"6715", "110912", "6813", "27572", "42773", "296536", "12232", 
"1076912", "6796", "11183", "4374", "103606", "777228", "189286", 
"404653", "7607", "1414804", "371075", "57821", "304889", "27424", 
"471400", "205184", "105035", "152452", "187806", "1284728", 
"644936", "38300", "309764", "89769", "44709", "295763", "1411042", 
"1237255", "95584", "514460", "668745", "NA", "525608", "6952", 
"411755", "4389", "22320", "42063", "863722", "24079", "93270", 
"357045", "2650850", "18624475", "67068", "236", "205276", "16620"
), pop16 = c(34656L, 40606L, 43847L, 2925L, 24211L, 8737L, 9758L, 
391L, 1425L, 9502L, 11331L, 2250L, 207653L, 7128L, 23439L, 36265L, 
17910L, 1378665L, 48653L, 4174L, 11476L, 1170L, 10566L, 5728L, 
10649L, 16385L, 95689L, 4955L, 1316L, 102403L, 899L, 5495L, 66860L, 
1980L, 3719L, 82349L, 10776L, 107L, 16582L, 7337L, 9814L, 335L, 
1324171L, 261115L, 80277L, 4755L, 8546L, 60627L, 23696L, 2881L, 
126995L, 17794L, 48462L, 1816L, 4053L, 6080L, 1960L, 2868L, 31187L, 
1263L, 127540L, 3552L, 3027L, 622L, 35277L, 17030L, 4693L, 185990L, 
20673L, 51246L, 5235L, 4034L, 103320L, 6725L, 37970L, 10325L, 
3407L, 2570L, 19702L, 144342L, 32276L, 7058L, 5607L, 5431L, 2065L, 
56015L, 25369L, 46484L, 39579L, 9923L, 8373L, 18430L, 22465L, 
8735L, 68864L, 7606L, 1365L, 11403L, 79512L, 41488L, 45005L, 
9270L, 65596L, 323406L, 31848L, 31568L, 94569L, 16150L), gold16 = c(0L, 
0L, 3L, 1L, 8L, 0L, 1L, 1L, 1L, 1L, 2L, 0L, 7L, 0L, 0L, 4L, 0L, 
26L, 3L, 5L, 5L, 0L, 1L, 2L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 
10L, 0L, 2L, 17L, 3L, 0L, 0L, 0L, 8L, 0L, 0L, 1L, 3L, 0L, 0L, 
8L, 1L, 6L, 12L, 3L, 6L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 8L, 4L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 2L, 0L, 1L, 0L, 
1L, 19L, 0L, 2L, 1L, 2L, 1L, 2L, 9L, 7L, 0L, 2L, 3L, 0L, 1L, 
1L, 2L, 0L, 0L, 0L, 1L, 0L, 2L, 0L, 27L, 46L, 4L, 0L, 1L, 0L), 
tot16 = c(0L, 2L, 4L, 4L, 29L, 1L, 18L, 2L, 2L, 9L, 6L, 0L, 
19L, 3L, 0L, 22L, 0L, 70L, 8L, 10L, 11L, 0L, 10L, 15L, 1L, 
0L, 3L, 0L, 1L, 8L, 1L, 1L, 42L, 0L, 7L, 42L, 6L, 1L, 0L, 
0L, 15L, 0L, 2L, 3L, 8L, 2L, 2L, 28L, 2L, 11L, 41L, 18L, 
13L, 1L, 0L, 0L, 0L, 4L, 5L, 0L, 5L, 0L, 2L, 0L, 1L, 19L, 
18L, 1L, 1L, 7L, 4L, 0L, 1L, 0L, 11L, 1L, 1L, 1L, 4L, 55L, 
0L, 8L, 1L, 4L, 4L, 10L, 21L, 17L, 0L, 11L, 7L, 0L, 3L, 1L, 
6L, 0L, 1L, 3L, 8L, 0L, 11L, 1L, 67L, 121L, 13L, 3L, 2L, 
0L), altitude = c(1790, 1, 10.5, 989, 605, 170, -28, 2, 6, 
198, 76, 983, 1079, 580, 726, 74, 521, 44, 2625, 130, 4, 
170, 244, 0, 0, 2850, 22, 2325, 37, 2355, 0, 25, 34, 0, 451, 
34, 153, 25, 1529, 100, 102, 15, 210, 3, 1189, 8, 754, 14, 
217, 53, 17, 338, 1795, 0, 5, 771, 8, 124, 60, 134, 2240, 
80, 1350, 61, 53, -2, 10, 777, 207, 6, 12, 0, 7, 54, 93, 
15, 3, 13, 70, 124, 624, 116, 0, 131, 281, 1271, 33, 667, 
377, 15, 542, 691, 5, 789, 1, 63, 0, 0, 938, 1190, 168, 13, 
14, 2, 459, 909, 25, 1483), athletes16 = c(3L, 64L, 215L, 
31L, 420L, 72L, 56L, 29L, 33L, 120L, 104L, 12L, 462L, 50L, 
24L, 310L, 42L, 392L, 143L, 85L, 117L, 15L, 104L, 119L, 26L, 
37L, 121L, 12L, 46L, 37L, 53L, 54L, 393L, 6L, 40L, 418L, 
92L, 7L, 21L, 37L, 154L, 8L, 112L, 28L, 63L, 76L, 47L, 309L, 
12L, 56L, 336L, 101L, 79L, 8L, 0L, 19L, 32L, 67L, 32L, 2L, 
123L, 23L, 43L, 35L, 48L, 237L, 195L, 71L, 6L, 31L, 62L, 
10L, 13L, 11L, 234L, 90L, 40L, 37L, 95L, 285L, 10L, 103L, 
25L, 52L, 63L, 135L, 135L, 307L, 6L, 151L, 103L, 7L, 57L, 
7L, 54L, 5L, 28L, 61L, 100L, 21L, 204L, 12L, 360L, 555L, 
70L, 86L, 22L, 30L)), class = "data.frame", row.names = c(NA, 
-108L))

您的gdp16变量属于类character。不能向字符添加数字。您需要将变量转换为数字类型(也许替换 NA(:

df$gdp16 <- as.numeric(df$gdp16)

你需要用实际的NA替换"NA",然后执行as.numeric:

oldat$gdp16LOG = log(as.numeric(replace(oldat$gdp16,oldat$gdp16=="NA",NA)))

你可以只做as.numeric(oldat$gdp16).它将返回一些错误消息,因为任何其他非数字字符串都将转换为 NA。

最新更新