将特定的列和行汇总到R中的新矩阵

时间:2018-08-21 06:10:28

标签: r matrix sum

我是R的较新用户,并且了解如何使我的代码正常工作,但我知道必须有一个 dplyr purrr 函数可以更有效地执行此操作并用更少的代码?如果有,我还没有找到。我的PI希望对我们的比赛数据进行汇总,但诀窍是将它们分开进行一场比赛,然后,如果他们回答了不止一场比赛,则将其总和细分。我对数据进行了一个子集处理,以获取仅这些列,然后将这些列分别添加到每一行中,然后将其输出到新的7x7矩阵中以获取每一列的总和。

这是我的代码。我的问题是有一种更有效的方法吗?

总和种族,以创建所有种族的总矩阵

subset <- subset(dataset[,11:17])
test <- matrix(,nrow=7, ncol=7)

colnames(test) <- c("African_American", "Asian", "Hawaiian_Pacific", "Native_Alaskan", "White_Euro", "Hispanic_Latino", "No-Answer")

rownames(test) <- c("African_American", "Asian", "Hawaiian_Pacific", "Native_Alaskan", "White_Euro", "Hispanic_Latino", "No-Answer")

基本设计为“如果== 1,则严格限制一场比赛。如果> 1杆属于适当类别

test[1,1] <- sum(subset$African_American==1, na.rm=TRUE)

test[1,2] <- sum(subset$African_American+subset$Asian>1, na.rm=TRUE)

test[1,3] <- sum(subset$African_American+subset$Hawaiian_Pacific>1, na.rm=TRUE)

test[1,4] <- sum(subset$African_American+subset$Native_Alaskan>1, na.rm=TRUE)

test[1,5] <- sum(subset$African_American+subset$White_Euro>1, na.rm=TRUE)

test[1,6] <- sum(subset$African_American+subset$Hispanic_Latino>1, na.rm=TRUE)

test[1,7] <- sum(subset$African_American+subset$`No-Answer`>1, na.rm=TRUE)

test[2,1] <- sum(subset$Asian+subset$African_American>1, na.rm=TRUE)

test[2,2] <- sum(subset$Asian==1, na.rm=TRUE)...

有7列要加在一起,所以它一直在矩阵中移动并输出类似的内容,其中对角线是一个种族的实际计数,其他种族是多次出现: matrix

1 个答案:

答案 0 :(得分:0)

我找到了一种不使用plyr但适用r-base函数的方法。

data = data.frame(set1 = round(runif(n = 10,min = 0,max = 1)),
              set2 = round(runif(n = 10,min = 0,max = 1)),
              set3 = round(runif(n = 10,min = 0,max = 1)),
              set4 = round(runif(n = 10,min = 0,max = 1)),
              set5 = round(runif(n = 10,min = 0,max = 1)),
              set6 = round(runif(n = 10,min = 0,max = 1)),
              set7 = round(runif(n = 10,min = 0,max = 1))
)
res = apply(combn(1:ncol(data), 2), 2, function(x) sum(data[, x[1]] & data[, x[2]]))
test <- matrix(0,nrow=7, ncol=7)
test[upper.tri(test)] = res
> test
 [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    5    3    2    2    4    2    2
[2,]    0    5    5    3    4    5    4
[3,]    0    0    6    3    1    0    5
[4,]    0    0    0    8    3    3    1
[5,]    0    0    0    0    2    2    2
[6,]    0    0    0    0    0    6    3
[7,]    0    0    0    0    0    0    6

第一部分是生成一些测试数据。 combn(1:ncol(data),2)告诉应用对每个2列组合使用一个函数。然后,对于两个值均为1的data [,x [1]]和data [,x [2]](两个选定的列)的所有条目,&函数返回TRUE。作为回报,您将获得所需的值。以下两行根据需要构造一个矩阵。 请注意,除了

res2 = apply(combn(1:ncol(data), 1), 2, function(x) sum(data[, x[1]]))
test[cbind(1:7,1:7)] <- res2
您还可以将对角线设置为正确的计数。无论如何,这仅适用于在2列中回答1个的对象。它不会找到亚洲,西班牙裔和美国人。但是您可以通过对3列的组合稍作更改来计算:

apply(combn(1:ncol(data), 3), 2, function(x) sum(data[, x[1]] & data[, x[2]] & data[, x[3]]))

还请注意,我的随机数据可能不具有代表性/不切实际。