我是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
答案 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]]))
还请注意,我的随机数据可能不具有代表性/不切实际。