首页 > 解决方案 > 在 R 中使用双循环添加一列

问题描述

patient=c(1,1,1,2,2,2,2,3,3,3)
CD4=c(10.677078, 8.426150, 9.433981, 3.464102, 3.605551, 6.164414 , 6.324555, 8.124038, 4.582576, 5.000000)

假设我有一个包含 3 个人和 10 个观察值的数据。现在我想添加另一列(有 10 行),其中包含每个人的 CD4 值的总和(例如,前 3 行将是相同的值,因为它们属于第一个患者)。

我知道有非常先进和简单的方法可以做到这一点。但是,如果我想使用双循环 [for i=1 to 3 and j=1 to n_(i)],那么使用双循环的 R 代码是什么?我是编码新手,这就是为什么要提前为这个蹩脚的问题道歉

标签: r

解决方案


澄清:永远不要为此目的运行双循环,我只是在回答被问到的问题。

df <- as.data.frame(list(patient=c(1,1,1,2,2,2,2,3,3,3), 
                         CD4=c(10.677078, 8.426150, 9.433981, 3.464102, 3.605551, 6.164414 , 6.324555, 8.124038, 4.582576, 5.000000)
))

df$CD4_sum <- 0
for (i in 1:nrow(df)) {
  for (j in unique(df$patient)) {
    df[grep(j,df$patient), "CD4_sum"] <- sum(df[grep(j,df$patient),"CD4"])
  }
}

head(df)

patient       CD4  CD4_sum
1       1 10.677078 28.53721
2       1  8.426150 28.53721
3       1  9.433981 28.53721
4       2  3.464102 19.55862
5       2  3.605551 19.55862
6       2  6.164414 19.55862

这是一种更有效的方法

> df %>% group_by(patient) %>% mutate(CD4_sum = sum(CD4))
# A tibble: 10 x 3
# Groups:   patient [3]
   patient   CD4 CD4_sum
     <dbl> <dbl>   <dbl>
 1       1 10.7     28.5
 2       1  8.43    28.5
 3       1  9.43    28.5
 4       2  3.46    19.6
 5       2  3.61    19.6
 6       2  6.16    19.6
 7       2  6.32    19.6
 8       3  8.12    17.7
 9       3  4.58    17.7
10       3  5       17.7

推荐阅读