Loop for Correlation Item-Score without containing Item

Viewed 22

I have a huge dataset and I want to compute the correlation of each item with the total score of the scale, but without containing the item. Now I could do it separately for each item, but I am trying to do a loop, so that it is a bit easier.

Example dataset:

dat <- read.table(header=TRUE, text="
ItemX1 ItemX2 ItemX3 ItemX4 ItemX5 ItemX6 ItemY1 ItemY2 ItemY3 ItemY4 ItemY5 ItemY6
1 1 0 1 0 1 1 1 0 1 0 1
0 1 0 0 0 1 0 1 0 0 0 1
1 1 0 1 0 1 1 1 0 1 0 0 
1 0 1 0 0 1 1 0 1 0 0 1 
1 1 0 1 1 1 1 1 0 1 1 0
0 0 1 1 0 0 0 0 1 1 0 0
")

xscore <- rowSums(select(dat, starts_with("ItemX")))

Now I could do it like the following, but as I have 107 Items it is a bit much.


cor(dat$ItemX1,rowSums(select(dat, starts_with("ItemX") & -"ItemX1")),use="pairwise.complete.obs")
cor(dat$ItemX2,rowSums(select(dat, starts_with("ItemX") & -"ItemX2")),use="pairwise.complete.obs")
cor(dat$ItemX3,rowSums(select(dat, starts_with("ItemX") & -"ItemX3")),use="pairwise.complete.obs")
cor(dat$ItemX4,rowSums(select(dat, starts_with("ItemX") & -"ItemX4")),use="pairwise.complete.obs")
cor(dat$ItemX5,rowSums(select(dat, starts_with("ItemX") & -"ItemX5")),use="pairwise.complete.obs")
cor(dat$ItemX6,rowSums(select(dat, starts_with("ItemX") & -"ItemX6")),use="pairwise.complete.obs")

That's why I'm trying out the following loop, but now I don't know how to specify that the rowSums is calculated without the item which is in use for the correlation.


variables <- names(dat)
names.item <- c(grep("ItemX", variables, value = TRUE))

item.diff.p <- data.frame(matrix(NA, ncol=2, nrow=(length(names.item)-1)))
names(item.diff.p) <- c("Item", "cor")
length(names.item)

for(i in 1:(length(names.item))-1){
  
  item <- names.item[i]
  
  par <- cor(dat[,names(dat)[grepl("ItemX",names(dat))]],
             rowSums(select(dat, starts_with("ItemX"))),use="pairwise.complete.obs")
  
  item.diff.p[i, c("cor")] 
  
}
par

Thank you all!

1 Answers

You can iterate through the columns of a subsetted dataframe, and calculate:

X_dat = dat[,grep("^ItemX",colnames(dat))]

res = sapply(1:ncol(X_dat),function(i){
       cor(X_dat[,i],rowSums(X_dat[,-i]),use="p")
})

names(res) = colnames(X_dat)

 res
    ItemX1     ItemX2     ItemX3     ItemX4     ItemX5     ItemX6 
 0.6324555  0.1250000 -0.7500000  0.1250000  0.4152274  0.2335497 
Related