如何通过使用多个字段与组计算值

问题描述 投票:0回答:1

我正在尝试在中实现非均匀熵类型的计算,但是在结构化方式上存在一些困难,这种方式会在一次执行中对每个区域进行计算。我可以一点一点地做,但是要花很长时间,因为我提供的示例数据非常简化。下面是一个示例,说明如何使用仅包含2个或3个基本单位的区域逐个区域进行计算。关于如何简化整个流程的任何指示?我可以使用按功能分组吗?

#Example Data
id <- c(1,2,3,4,5,6,7)
Region_ID <- c(1,2,2,3,1,3,2)
BaseunitPOP <- c(10000,4000,8000,8000,10000,11000,13000)
RegionPOP<- c(20000,25000,25000,19000,20000,19000,25000)

S.data <- data.frame(id, Region_ID, BaseunitPOP,RegionPOP)

#For each region, calculate the entropy using the workflow below

#region 1
 -(10000*log((10000/20000),2)+(10000*log((10000/20000),2)))

#region 2
-(4000*log((4000/25000),2)+(8000*log((8000/25000),2))+(13000*log((13000/25000),2))

#and so on...

请注意,这些计算(例如区域2):

  • 4000是基本单位id2的总数
  • 25000是该地区的人口
  • 8000是基本单元id3的总数
  • 13000是基本单元id7的总数
  • 2是一个常数

提前感谢。

[在弄清楚如何在上面提供的示例数据中实现之后,我将尝试使其在我的数据中起作用(链接中的图片)。My Data

new("SpatialPointsDataFrame", data = structure(list(TOTPOP_CY = structure(c(707L, 
502L, 206L, 231L), .Label = c("1000", "1001", "1002", "1004", 
"1005", "1006", "1007", "1008", "1011", "1012", "1013", "1019", 
"1020", "1021", "1022", "1023", "1024", "1025", "1026", "1027", 
"1029", "1030", "1032", "1033", "1034", "1035", "1036", "1038", 
"1039", "1040", "1041", "1043", "1044", "1045", "1046", "1047", 
"1048", "1049", "1050", "1052", "1055", "1056", "1057", "1058", 
"1059", "1061", "1062", "1063", "1064", "1066", "1067", "1068", 
"1069", "1070", "1071", "1072", "1073", "1074", "1075", "1076", 
"1080", "1082", "1083", "1084", "1085", "1086", "1087", "1090", 
"1091", "1092", "1093", "1094", "1095", "1096", "1097", "1098", 
"1099", "1100", "1101", "1102", "1107", "1108", "1109", "1110", 
"1111", "1112", "1113", "1115", "1116", "1117", "1118", "1119", 
"1120", "1122", "1124", "1125", "1127", "1128", "1129", "1130", 
"1131", "1132", "1133", "1134", "1135", "1136", "1137", "1138", 
"1139", "1140", "1141", "1144", "1145", "1146", "1148", "1149", 
"1150", "1152", "1153", "1154", "1155", "1159", "1160", "1162", 
"1164", "1165", "1166", "1168", "1169", "1170", "1171", "1172", 
"1173", "1174", "1175", "1176", "1177", "1178", "1179", "1180", 
"1181", "1184", "1185", "1186", "1187", "1188", "1189", "1190", 
"1191", "1192", "1193", "1194", "1195", "1196", "1197", "1198", 
"1199", "1200", "1203", "1204", "1205", "1206", "1207", "1208", 
"1209", "1210", "1211", "1212", "1213", "1214", "1215", "1216", 
"1217", "1218", "1219", "1220", "1222", "1224", "1225", "1226", 
"1227", "1229", "1230", "1231", "1232", "1233", "1234", "1235", 
"1237", "1238", "1239", "1240", "1241", "1242", "1243", "1244", 
"1245", "1246", "1248", "1249", "1250", "1251", "1252", "1253", 
"1254", "1255", "1256", "1257", "1259", "1260", "1262", "1263", 
"1264", "1265", "1266", "1267", "1268", "1269", "1270", "1271", 
"1272", "1273", "1274", "1275", "1276", "1277", "1278", "1279", 
"1281", "1282", "1283", "1284", "1285", "1286", "1287", "1288", 
"1289", "1295", "1297", "1300", "1302", "1303", "1304", "1305", 
"1306", "1307", "1309", "1310", "1311", "1312", "1313", "1314", 
"1315", "1316", "1317", "1320", "1321", "1322", "1323", "1324", 
"1325", "1327", "1328", "1329", "1330", "1331", "1332", "1333", 
"1334", "1335", "1336", "1337", "1338", "1339", "1343", "1344", 
"1346", "1347", "1348", "1349", "1350", "1351", "1352", "1353", 
"1354", "1355", "1356", "1360", "1361", "1362", "1363", "1364", 
"1366", "1367", "1370", "1371", "1372", "1373", "1374", "1375", 
"1376", "1377", "1378", "1379", "1380", "1381", "1382", "1384", 
"1385", "1386", "1387", "1388", "1389", "1390", "1392", "1395", 
"1396", "1397", "1398", "1399", "1400", "1401", "1402", "1404", 
"1405", "1407", "1408", "1409", "1411", "1412", "1414", "1415", 
"1416", "1417", "1418", "1419", "1420", "1422", "1423", "1424", 
"1427", "1430", "1431", "1432", "1433", "1435", "1436", "1438", 
"1439", "1442", "1445", "1447", "1448", "1449", "1450", "1451", 
"1452", "1453", "1454", "1457", "1458", "1459", "1460", "1461", 
"1462", "1463", "1464", "1466", "1467", "1468", "1469", "1471", 
"1472", "1474", "1475", "1476", "1477", "1478", "1479", "1480", 
"1481", "1482", "1484", "1485", "1486", "1487", "1488", "1492", 
"1493", "1495", "1496", "1497", "1499", "1500", "1502", "1503", 
"1504", "1507", "1510", "1511", "1513", "1515", "1516", "1517", 
"1519", "1520", "1521", "1522", "1523", "1525", "1526", "1528", 
"1530", "1531", "1533", "1536", "1537", "1538", "1539", "1540", 
"1541", "1542", "1543", "1544", "1545", "1546", "1547", "1548", 
"1549", "1551", "1553", "1554", "1555", "1556", "1557", "1558", 
"1560", "1562", "1563", "1565", "1566", "1568", "1570", "1571", 
"1572", "1573", "1574", "1575", "1576", "1577", "1579", "1581", 
"1582", "1584", "1585", "1586", "1589", "1590", "1592", "1593", 
"1594", "1595", "1596", "1598", "1600", "1601", "1602", "1604", 
"1605", "1606", "1607", "1608", "1609", "1610", "1612", "1613", 
"1614", "1615", "1617", "1619", "1622", "1623", "1624", "1626", 
"1628", "1629", "1631", "1632", "1636", "1637", "1639", "1641", 
"1644", "1645", "1647", "1648", "1649", "1652", "1653", "1654", 
"1655", "1656", "1658", "1659", "1660", "1662", "1663", "1666", 
"1667", "1668", "1671", "1675", "1679", "1682", "1683", "1684", 
"1685", "1687", "1688", "1689", "1690", "1691", "1695", "1707", 
"1710", "1712", "1714", "1720", "1722", "1723", "1724", "1725", 
"1726", "1730", "1731", "1732", "1733", "1734", "1739", "1741", 
"1744", "1745", "1746", "1747", "1748", "1749", "1753", "1754", 
"1755", "1759", "1761", "1766", "1767", "1770", "1771", "1772", 
"1778", "1781", "1782", "1784", "1786", "1787", "1792", "1793", 
"1796", "1797", "1798", "1801", "1806", "1807", "1812", "1813", 
"1815", "1816", "1817", "1818", "1825", "1829", "1831", "1832", 
"1834", "1835", "1836", "1838", "1839", "1841", "1844", "1846", 
"1850", "1851", "1855", "1857", "1859", "1862", "1870", "1871", 
"1874", "1879", "1887", "1888", "1891", "1894", "1895", "1896", 
"1897", "1898", "1903", "1905", "1908", "1911", "1912", "1914", 
"1919", "1921", "1922", "1923", "1924", "1929", "1931", "1934", 
"1937", "1939", "1943", "1945", "1946", "1947", "1953", "1955", 
"1957", "1959", "1963", "1965", "1966", "1973", "1979", "1985", 
"1986", "1987", "1989", "1990", "1996", "1998", "1999", "2001", 
"2002", "2008", "2013", "2017", "2018", "2022", "2023", "2028", 
"2029", "2030", "2034", "2039", "2042", "2043", "2044", "2051", 
"2054", "2058", "2059", "2066", "2067", "2068", "2071", "2072", 
"2073", "2074", "2084", "2087", "2090", "2093", "2096", "2101", 
"2105", "2116", "2118", "2119", "2120", "2121", "2122", "2127", 
"2132", "2134", "2140", "2141", "2143", "2145", "2148", "2154", 
"2155", "2156", "2157", "2166", "2169", "2171", "2175", "2176", 
"2182", "2191", "2193", "2196", "2198", "2203", "2206", "2210", 
"2211", "2212", "2221", "2224", "2227", "2229", "2231", "2237", 
"2239", "2241", "2248", "2249", "2250", "2252", "2256", "2265", 
"2266", "2277", "2278", "2283", "2288", "2291", "2292", "2297", 
"2303", "2307", "2318", "2352", "2358", "2359", "2362", "2363", 
"2373", "2383", "2389", "2390", "2392", "2398", "2400", "2402", 
"2403", "2408", "2415", "2417", "2420", "2423", "2424", "2425", 
"2438", "2447", "2448", "2450", "2451", "2452", "2453", "2456", 
"2458", "2462", "2464", "2475", "2481", "2484", "2493", "2495", 
"2500", "2502", "2505", "2512", "2513", "2533", "2534", "2536", 
"2541", "2542", "2544", "2549", "2558", "2560", "2565", "2574", 
"2579", "2583", "2587", "2595", "2597", "2613", "2616", "2624", 
"2631", "2636", "2640", "2643", "2644", "2650", "2655", "2666", 
"267", "2671", "2678", "2686", "2692", "2693", "270", "2700", 
"2701", "2702", "2712", "2715", "2718", "2726", "2732", "2742", 
"2751", "2757", "2766", "2777", "2786", "2787", "2797", "2799", 
"2800", "2814", "2824", "2839", "2840", "2847", "2855", "2865", 
"2867", "2879", "2884", "2889", "289", "2892", "2897", "2911", 
"2923", "2932", "2935", "2936", "2972", "2976", "2997", "3001", 
"3005", "3007", "3010", "3018", "3037", "3038", "3045", "3048", 
"3061", "3077", "3094", "3103", "3140", "3148", "3179", "3222", 
"3227", "3249", "3272", "3274", "3291", "3295", "3310", "3318", 
"3349", "3358", "3371", "3416", "3467", "3490", "3509", "3529", 
"3538", "3572", "3649", "3656", "3677", "3684", "3707", "3758", 
"3771", "3959", "3975", "3982", "4104", "4111", "4281", "4397", 
"4553", "456", "4651", "4671", "468", "4730", "4753", "4790", 
"4812", "4833", "4848", "4882", "501", "5062", "507", "5101", 
"513", "529", "535", "5352", "545", "551", "5512", "556", "564", 
"565", "5658", "570", "571", "577", "580", "5812", "586", "587", 
"5899", "594", "598", "600", "6017", "602", "6022", "6033", "606", 
"608", "6080", "609", "610", "611", "612", "6151", "617", "618", 
"621", "622", "623", "625", "628", "631", "632", "635", "638", 
"640", "641", "643", "644", "645", "646", "647", "649", "6515", 
"652", "655", "657", "659", "660", "661", "663", "664", "665", 
"667", "669", "670", "671", "672", "673", "674", "677", "678", 
"679", "680", "681", "682", "683", "684", "685", "686", "687", 
"688", "689", "690", "691", "693", "694", "6942", "695", "697", 
"698", "699", "700", "701", "703", "704", "706", "707", "708", 
"709", "710", "711", "712", "713", "714", "715", "717", "718", 
"719", "720", "721", "722", "724", "727", "728", "729", "730", 
"731", "732", "733", "734", "735", "7367", "737", "738", "739", 
"741", "742", "743", "744", "745", "746", "748", "749", "750", 
"751", "752", "753", "754", "755", "756", "757", "758", "760", 
"762", "764", "765", "766", "767", "768", "769", "770", "771", 
"772", "773", "774", "775", "776", "777", "7774", "780", "781", 
"782", "783", "784", "785", "787", "788", "789", "792", "793", 
"794", "795", "796", "797", "798", "799", "801", "802", "803", 
"804", "805", "806", "807", "808", "809", "810", "811", "812", 
"813", "814", "815", "816", "817", "818", "820", "822", "823", 
"825", "826", "827", "828", "829", "830", "831", "832", "833", 
"834", "835", "836", "838", "839", "840", "841", "842", "844", 
"845", "846", "847", "848", "849", "851", "852", "853", "854", 
"855", "856", "857", "858", "859", "860", "861", "862", "863", 
"864", "865", "866", "867", "868", "869", "870", "871", "872", 
"873", "874", "876", "877", "878", "879", "880", "881", "882", 
"884", "885", "886", "888", "890", "8901", "891", "892", "893", 
"894", "895", "896", "8965", "898", "899", "900", "901", "902", 
"903", "904", "906", "907", "908", "909", "910", "911", "912", 
"913", "914", "915", "916", "917", "918", "919", "920", "921", 
"922", "923", "924", "925", "927", "928", "929", "931", "932", 
"933", "934", "935", "936", "937", "938", "939", "940", "941", 
"942", "943", "944", "945", "946", "947", "948", "949", "951", 
"952", "953", "954", "955", "957", "958", "960", "961", "962", 
"963", "964", "965", "966", "967", "968", "969", "970", "971", 
"972", "973", "974", "975", "976", "977", "978", "979", "980", 
"981", "982", "983", "984", "985", "987", "988", "989", "990", 
"991", "992", "993", "994", "995", "996", "997", "998", "999"
), class = "factor"), SOMid = structure(c(41L, 41L, 80L, 32L), .Label = c("0", 
"1", "10", "100", "101", "102", "103", "104", "105", "106", "107", 
"108", "109", "11", "110", "111", "112", "113", "114", "115", 
"116", "117", "12", "13", "14", "15", "16", "17", "18", "19", 
"2", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", 
"3", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", 
"4", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", 
"5", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", 
"6", "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", 
"7", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", 
"8", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", 
"9", "90", "91", "92", "93", "94", "95", "96", "97", "98", "99"
), class = "factor"), SOMPOP = structure(c(45L, 45L, 102L, 72L
), .Label = c("19943", "20075", "20092", "20103", "20123", "20124", 
"20171", "20176", "20222", "20229", "20266", "20484", "20492", 
"20508", "20534", "20558", "20588", "20706", "20751", "20752", 
"20848", "20948", "21073", "21091", "21270", "21348", "21384", 
"21408", "21461", "21506", "21511", "21523", "21539", "21581", 
"21623", "21658", "21693", "21733", "21796", "21918", "21941", 
"21964", "22040", "22084", "22138", "22158", "22214", "22232", 
"22330", "22365", "22368", "22413", "22463", "22474", "22480", 
"22610", "22635", "23038", "23092", "23277", "23406", "23535", 
"23579", "23599", "23908", "23940", "23987", "24068", "24180", 
"24203", "24449", "24568", "24637", "24767", "24797", "24866", 
"25005", "25308", "25652", "25717", "25827", "25897", "25998", 
"26279", "26428", "26447", "26797", "26836", "27427", "27582", 
"27701", "27885", "28099", "28879", "28973", "29007", "29082", 
"29158", "29196", "29217", "29452", "29678", "30866", "31380", 
"31718", "32268", "32789", "32984", "33043", "34578", "34995", 
"35082", "36112", "37832", "38703", "39637", "41303", "42442"
), class = "factor"), REDCAPid = structure(c(12L, 12L, 12L, 26L
), .Label = c("0", "1", "10", "100", "101", "102", "103", "11", 
"12", "13", "14", "15", "16", "17", "18", "19", "2", "20", "21", 
"22", "23", "24", "25", "26", "27", "28", "29", "3", "30", "31", 
"32", "33", "34", "35", "36", "37", "38", "39", "4", "40", "41", 
"42", "43", "44", "45", "46", "47", "48", "49", "5", "50", "51", 
"52", "53", "54", "55", "56", "57", "58", "59", "6", "60", "61", 
"62", "63", "64", "65", "66", "67", "68", "69", "7", "70", "71", 
"72", "73", "74", "75", "76", "77", "78", "79", "8", "80", "81", 
"82", "83", "84", "85", "86", "87", "88", "89", "9", "90", "91", 
"92", "93", "94", "95", "96", "97", "98", "99"), class = "factor"), 
    REDCAPPOP = structure(c(26L, 26L, 26L, 104L), .Label = c("20149", 
    "20207", "20286", "20313", "20385", "20399", "20492", "20616", 
    "20625", "20733", "20736", "20824", "20852", "20889", "21029", 
    "21158", "21180", "21231", "21271", "21279", "21391", "21435", 
    "21590", "21595", "21661", "21685", "22155", "22279", "22510", 
    "22656", "23007", "23048", "23524", "23572", "23734", "24212", 
    "24254", "24464", "24607", "24632", "24660", "24741", "24908", 
    "24932", "24996", "25051", "25147", "25205", "25288", "25442", 
    "25479", "25953", "25974", "26424", "26936", "26945", "27121", 
    "27426", "27638", "28022", "28092", "28271", "28409", "28475", 
    "29102", "29376", "29421", "29871", "29996", "30317", "30615", 
    "30653", "31349", "31593", "31820", "32178", "32473", "32697", 
    "33145", "33191", "33416", "33779", "33885", "34116", "35639", 
    "35733", "35757", "36277", "36963", "36976", "37376", "38004", 
    "38928", "40199", "40218", "40729", "40994", "41734", "42420", 
    "44186", "44595", "47983", "49209", "49572"), class = "factor"), 
    MAXPid = c(0L, 0L, 0L, 0L), MAXPPOP = c(22735L, 22735L, 22735L, 
    22735L)), row.names = c(NA, 4L), class = "data.frame"), coords.nrs = numeric(0), 
    coords = structure(c(482201.4333, 481883.4586, 483485.1084, 
    480435.2772, 5004169.8777, 5001808.0206, 5004236.3722, 5005944.4531
    ), .Dim = c(4L, 2L), .Dimnames = list(NULL, c("coords.x1", 
    "coords.x2"))), bbox = structure(c(480435.2772, 5001808.0206, 
    483485.1084, 5005944.4531), .Dim = c(2L, 2L), .Dimnames = list(
        c("coords.x1", "coords.x2"), c("min", "max"))), proj4string = new("CRS", 
        projargs = "+proj=utm +zone=15 +datum=NAD83 +units=m +no_defs +ellps=GRS80 +towgs84=0,0,0"))
r dataframe matrix group-by data-manipulation
1个回答
0
投票

这是一个整洁的解决方案(我认为代码是很容易解释的,但是如果有任何您无法遵循的内容,请在评论中让我知道,我会尽力解释):

library(dplyr)
S.data %>% group_by(Region_ID) %>% # once you group_by, the rest is just vectorized calculation
  summarise(result=-sum(BaseunitPOP*log((BaseunitPOP/RegionPOP),2)))
# A tibble: 3 x 2
  Region_ID result
      <dbl>  <dbl>
1         1 20000 
2         2 35991.
3         3 18657.

或者,对于仅基本解决方案:

sapply(split(S.data, S.data$Region_ID), function(x) 
            -sum(x["BaseunitPOP"]*log((x["BaseunitPOP"]/x["RegionPOP"]),2)))

       1        2        3 
20000.00 35990.69 18656.87 

UPDATE

我使用了您通过dput提供的数据,并且我注意到出于某种原因TOTPOP_CY和SOMPOP(以及其他几个原因)是因子,而不是数字或整数。不知道为什么会这样,所以让我们从修复此问题开始:

S.data$TOTPOP_CY<-as.numeric(S.data$TOTPOP_CY)
S.data$SOMPOP<-as.numeric(S.data$SOMPOP)

完成此操作后,一旦通过as.data.frame,就可以将原始解决方案应用于数据集。请注意,但是,这可能会导致在rgdal中使用结果时出现一些问题,因此您可能需要将其传递回SpatialPointsDataFrame

as.data.frame(S.data) %>% group_by(SOMid) %>% 
     summarise(result=-sum(TOTPOP_CY*log((TOTPOP_CY/SOMPOP),2)))
# A tibble: 3 x 2
  SOMid result
  <fct>  <dbl>
1 20     -389.
2 29    -4556.
3 64     -209.
© www.soinside.com 2019 - 2024. All rights reserved.