r - 在 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 代码是什么?我是编码新手,这就是为什么要提前为这个蹩脚的问题道歉
解决方案
澄清:永远不要为此目的运行双循环,我只是在回答被问到的问题。
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
推荐阅读
- spring-boot - 我的 @WebMvcTest 测试类如何在 Spring Boot 中使用此 JDBC 身份验证配置进行初始化?
- azure-devops - 如何使用 REST API 在发布定义中设置代理队列?
- excel - 使用 VBA,通过引用该范围复制格式为 12.3456 的范围会得到 12,3456。(用逗号代替点)
- javascript - 如何计算前导零?
- php - 在取消选择一个 Select2::widget 的值时,它会从所有列中删除过滤器
- haskell - 关于 hFlush 和惰性求值的问题
- python - How to update OptionsMenu values Python?
- typescript - 如何为联合类型参数提供默认值而不得到“可以用不同的约束子类型实例化”
- python - 提取部分字符串匹配,直到列中的特定字符
- jpa - 如何删除/更新/排序 JPQL 语句中的注释