作者:茶人2502933107 | 来源:互联网 | 2022-12-07 10:22
我正在查看加拿大安大略省的人口普查数据,并且列中有相同的列名(它们具有相同的名称,因为它们代表了人口普查区域的不同细分).我想对任何具有相同列名但遇到麻烦的列进行逐行求和.在我的示例数据中,只有重复的列名,但在实际数据中有几个具有相同名称的列.R中是否有矢量化方式来执行此操作?
TORONTO HALTON PEEL YORK BRANT HALDIMAND-NORFOLK HAMILTON MUSKOKA NIAGARA
20855 4011 11178 8138 996 739 3835 305 2923
23281 3997 11770 8417 961 684 4095 343 2970
24130 3900 11810 8306 972 732 4168 334 2985
TORONTO HALTON PEEL YORK BRANT HALDIMAND-NORFOLK HAMILTON MUSKOKA NIAGARA
39924 7863 21415 15714 1947 1428 7320 646 5675
44357 7820 22340 16261 1861 1369 7755 697 5775
46016 7679 22577 16260 1971 1447 7883 717 5868
我试着用ifelse声明没有运气.像这样的伪代码:
# where i is the column name
for every column with name i(sum rows of each column with name == i)
非常感谢任何指导!!
1> akrun..:
我们可以split
基于该数据集names
的数据集和应用rowSums
上list
具有相同名称的数据集
do.call(cbind, lapply(split.default(dfN, names(dfN)), rowSums, na.rm = TRUE))
# BRANT HALDIMAND.NORFOLK HALTON HAMILTON MUSKOKA NIAGARA PEEL TORONTO YORK
#[1,] 2943 2167 11874 11155 951 8598 32593 60779 23852
#[2,] 2822 2053 11817 11850 1040 8745 34110 67638 24678
#[3,] 2943 2179 11579 12051 1051 8853 34387 70146 24566
或者正如@thelatemail提到的,如果我们需要一个data.frame
输出,包住list
输出,data.frame
data.frame(lapply(split.default(dfN, names(dfN)), rowSums, na.rm = TRUE))
或使用 tidyverse
library(tidyverse)
dfN %>%
split.default(names(.)) %>%
map_df(reduce, `+`)
# A tibble: 3 x 9
# BRANT HALDIMAND.NORFOLK HALTON HAMILTON MUSKOKA NIAGARA PEEL TORONTO YORK
#
#1 2943 2167 11874 11155 951 8598 32593 60779 23852
#2 2822 2053 11817 11850 1040 8745 34110 67638 24678
#3 2943 2179 11579 12051 1051 8853 34387 70146 24566
数据
dfN <- structure(list(TOROnTO= c(20855L, 23281L, 24130L), HALTON = c(4011L,
3997L, 3900L), PEEL = c(11178L, 11770L, 11810L), YORK = c(8138L,
8417L, 8306L), BRANT = c(996L, 961L, 972L), HALDIMAND.NORFOLK = c(739L,
684L, 732L), HAMILTON = c(3835L, 4095L, 4168L), MUSKOKA = c(305L,
343L, 334L), NIAGARA = c(2923L, 2970L, 2985L), TOROnTO= c(39924L,
44357L, 46016L), HALTON = c(7863L, 7820L, 7679L), PEEL = c(21415L,
22340L, 22577L), YORK = c(15714L, 16261L, 16260L), BRANT = c(1947L,
1861L, 1971L), HALDIMAND.NORFOLK = c(1428L, 1369L, 1447L), HAMILTON = c(7320L,
7755L, 7883L), MUSKOKA = c(646L, 697L, 717L), NIAGARA = c(5675L,
5775L, 5868L)), class = "data.frame", row.names = c(NA, -3L))
尼斯.您应该能够将`lapply()`结果直接转换为`data.frame` - `data.frame(lapply(split.default(dfN,names(dfN)),rowSums,na.rm = TRUE) )`