我有一个收件箱,它 for each ID指示邻近ID.我的第二个收件箱包含每个唯一ID的计数值.

目标是创建一个变量,对于每个ID,该变量是相邻ID计数的总和;如果邻居V1的计数是10,V2的计数是40,V3的计数是120,那么该ID的期望输出是170.

我在下面创建了一个脚本,可以为我做到这一点,但它非常慢.由于我的实际数据集很大(既长又宽),所以我想优化此转换的速度.还有其他办法吗?

row_sum <- function(row) {
  row_values <- unlist(lapply(row, function(ID) df_counts$count[df_counts$ID == ID]))
  sum(row_values, na.rm=TRUE)
}

set.seed(42)  ## for sake of reproducibility

#mockup data to reproduce problem
df1 <- data.frame(ID=sort(sample(1:100)), V1_id=sample(1:100), 
                  V2_id=sample(1:100), V3_id=sample(1:100))

df_counts <- data.frame(ID=sort(sample(1:100)), 
                        count=runif(100, min=0, max=999))

sum_of_counts <- as.data.frame(apply(df1, 1, row_sum))               

请注意,情况并非如此.

ID sum_of_counts
1 920
2 940

推荐答案

如果我理解正确的话,您希望添加与df1中的V*_id对应的值df_counts,并将它们添加为新列.

> transform(df1, foo=rowSums(sapply(df1[-1], \(i) df_counts[i, 'count'])))
     ID V1_id V2_id V3_id       foo
1     1     1    28     3 2832.9074
2     2    13    79    33 1452.9103
3     3    78    93    93  374.8441
4     4     5    57    84 1851.1584
5     5    73    84     9 2133.3638
6     6    55    89    54 1358.5333
7     7    16    80    10 1156.1185
8     8    90    88    71 1168.0793
9     9    43    61    92  959.9667
10   10    42    43    82 1076.2204
11   11    91    22    25 1292.1155
12   12    57    26    74 1705.8851
13   13    29    54    73 2165.5263
14   14    25    98    19  852.5623
15   15    63    96    79  750.5993
[...]

R相关问答推荐

如何将y轴设置为在ggplot 2中x=0处与x轴相交?

创建计数(带重置)变量

使用列表列作为case_when LHS的输入

图片中令人惊讶的行为

使用case_when和Mutate搜索多个列以寻找条件

在ubuntu 22.04上更新到R4.4后包安装出现编译错误

使用rlang s arg_match判断函数输入列表

使用R中的gt对R中的html rmarkdown文件进行条件格式设置表的单元格

根据列表中项目的名称多次合并数据框和列表

R Tidymodels textercipes-使用spacyR进行标记化-如何从生成的标记列表中删除标点符号

如何在R中添加截止点到ROC曲线图?

修改用R编写的用户定义函数

为了网络分析目的,将数据框转换为长格式列联表

如何根据R中其他变量的类别汇总值?

如何将一个方阵分解成没有循环的立方体

远离理论值的伽马密度曲线下面积的近似

在具有多个响应变量的比例堆叠条形图上方添加总计

如何计算每12行的平均数?

数值型数据与字符混合时如何进行绑定

是否有一个R函数可以输出在输入的字符向量中找到的相应正则表达式模式?