R:通过循环对列的值求和
R: Summing values of columns through a loop
我是 R 和这个论坛的新手,需要帮助构建循环。
(我是一名编程经验几乎为零的生物系学生)。
我的数据框具有以下(简化)结构:
a = "TNS"
b = NA
c = NA
d = 21
e = 37
f = 1
g = 39
h = 29
df = data.frame (a,b,c,d,e,f,g,h)
实际上,我的数据框由 210 行和 90 列组成,但我现在对其他行并不感兴趣。
我正在寻找的是一种方法,可以对除前三列之外的每一列的值求和,并将这些结果作为新列自动添加到我的数据框的末尾。
这将优先导致 data.frame 如下:
a = "TNS"
b = NA
c = NA
d = 21
e = 37
f = 1
g = 39
h = 29
de = 58
df = 22
dg = 60
dh = 50
ef = 38
eg = 76
eh = 66
fg = 40
fh = 30
gh = 68
df = data.frame (a,b,c,d,e,f,g,h,de,df,dg,dh,ef,eg,eh,fg,fh,gh)
它不能对每一列进行多次配对。并且有 运行 每个配对的循环我需要为每个三重列、四重列等做它
我为什么要这样做?我需要为生物多样性研究项目的 85 列执行此操作,并且手动计算每个组合的值会花费太多时间。
任何帮助将不胜感激,因为我真的没有 R 的经验,无法自己想出解决方案!!!
您可以将 combn
与 rowSums
结合使用,如下所示:
## This creates the names for the new columns we'll be creating
nam <- combn(names(df)[-c(1, 2, 3)], 2, FUN = function(x) paste(x, collapse = ""))
## Create and assign to your original data.frame
df[nam] <- combn(names(df)[-c(1, 2, 3)], 2,
FUN = function(x) rowSums(df[x], na.rm = TRUE), simplify = FALSE)
df
# a b c d e f g h de df dg dh ef eg eh fg fh gh
# 1 TNS NA NA 3 3 10 5 9 6 13 8 12 13 8 12 15 19 14
# 2 TNS NA NA 4 2 3 6 7 6 7 10 11 5 8 9 9 10 13
# 3 TNS NA NA 6 7 7 5 8 13 13 11 14 14 12 15 12 15 13
# 4 TNS NA NA 10 4 2 2 6 14 12 12 16 6 6 10 4 8 8
# 5 TNS NA NA 3 8 3 9 6 11 6 12 9 11 17 14 12 9 15
# 6 TNS NA NA 9 5 4 7 8 14 13 16 17 9 12 13 11 12 15
# 7 TNS NA NA 10 8 1 8 1 18 11 18 11 9 16 9 9 2 9
# 8 TNS NA NA 7 10 4 2 5 17 11 9 12 14 12 15 6 9 7
# 9 TNS NA NA 7 4 9 8 8 11 16 15 15 13 12 12 17 17 16
# 10 TNS NA NA 1 8 4 5 7 9 5 6 8 12 13 15 9 11 12
这是用于此答案的示例数据:
set.seed(1)
df <- data.frame(a = "TNS", b = NA, c = NA,
matrix(sample(10, 50, TRUE), ncol = 5,
dimnames = list(NULL, c("d", "e", "f", "g", "h"))))
df
# a b c d e f g h
# 1 TNS NA NA 3 3 10 5 9
# 2 TNS NA NA 4 2 3 6 7
# 3 TNS NA NA 6 7 7 5 8
# 4 TNS NA NA 10 4 2 2 6
# 5 TNS NA NA 3 8 3 9 6
# 6 TNS NA NA 9 5 4 7 8
# 7 TNS NA NA 10 8 1 8 1
# 8 TNS NA NA 7 10 4 2 5
# 9 TNS NA NA 7 4 9 8 8
# 10 TNS NA NA 1 8 4 5 7
我是 R 和这个论坛的新手,需要帮助构建循环。 (我是一名编程经验几乎为零的生物系学生)。
我的数据框具有以下(简化)结构:
a = "TNS"
b = NA
c = NA
d = 21
e = 37
f = 1
g = 39
h = 29
df = data.frame (a,b,c,d,e,f,g,h)
实际上,我的数据框由 210 行和 90 列组成,但我现在对其他行并不感兴趣。 我正在寻找的是一种方法,可以对除前三列之外的每一列的值求和,并将这些结果作为新列自动添加到我的数据框的末尾。 这将优先导致 data.frame 如下:
a = "TNS"
b = NA
c = NA
d = 21
e = 37
f = 1
g = 39
h = 29
de = 58
df = 22
dg = 60
dh = 50
ef = 38
eg = 76
eh = 66
fg = 40
fh = 30
gh = 68
df = data.frame (a,b,c,d,e,f,g,h,de,df,dg,dh,ef,eg,eh,fg,fh,gh)
它不能对每一列进行多次配对。并且有 运行 每个配对的循环我需要为每个三重列、四重列等做它
我为什么要这样做?我需要为生物多样性研究项目的 85 列执行此操作,并且手动计算每个组合的值会花费太多时间。
任何帮助将不胜感激,因为我真的没有 R 的经验,无法自己想出解决方案!!!
您可以将 combn
与 rowSums
结合使用,如下所示:
## This creates the names for the new columns we'll be creating
nam <- combn(names(df)[-c(1, 2, 3)], 2, FUN = function(x) paste(x, collapse = ""))
## Create and assign to your original data.frame
df[nam] <- combn(names(df)[-c(1, 2, 3)], 2,
FUN = function(x) rowSums(df[x], na.rm = TRUE), simplify = FALSE)
df
# a b c d e f g h de df dg dh ef eg eh fg fh gh
# 1 TNS NA NA 3 3 10 5 9 6 13 8 12 13 8 12 15 19 14
# 2 TNS NA NA 4 2 3 6 7 6 7 10 11 5 8 9 9 10 13
# 3 TNS NA NA 6 7 7 5 8 13 13 11 14 14 12 15 12 15 13
# 4 TNS NA NA 10 4 2 2 6 14 12 12 16 6 6 10 4 8 8
# 5 TNS NA NA 3 8 3 9 6 11 6 12 9 11 17 14 12 9 15
# 6 TNS NA NA 9 5 4 7 8 14 13 16 17 9 12 13 11 12 15
# 7 TNS NA NA 10 8 1 8 1 18 11 18 11 9 16 9 9 2 9
# 8 TNS NA NA 7 10 4 2 5 17 11 9 12 14 12 15 6 9 7
# 9 TNS NA NA 7 4 9 8 8 11 16 15 15 13 12 12 17 17 16
# 10 TNS NA NA 1 8 4 5 7 9 5 6 8 12 13 15 9 11 12
这是用于此答案的示例数据:
set.seed(1)
df <- data.frame(a = "TNS", b = NA, c = NA,
matrix(sample(10, 50, TRUE), ncol = 5,
dimnames = list(NULL, c("d", "e", "f", "g", "h"))))
df
# a b c d e f g h
# 1 TNS NA NA 3 3 10 5 9
# 2 TNS NA NA 4 2 3 6 7
# 3 TNS NA NA 6 7 7 5 8
# 4 TNS NA NA 10 4 2 2 6
# 5 TNS NA NA 3 8 3 9 6
# 6 TNS NA NA 9 5 4 7 8
# 7 TNS NA NA 10 8 1 8 1
# 8 TNS NA NA 7 10 4 2 5
# 9 TNS NA NA 7 4 9 8 8
# 10 TNS NA NA 1 8 4 5 7