通过匹配R中的两个或多个变量来选择第三个变量的值

通过匹配R中的两个或多个变量来选择第三个变量的值,r,for-loop,R,For Loop,我想通过将df$Data_ID中每个项目的名称与下面创建的稀疏矩阵的列名相匹配,然后选择df$Response的相应值来填充稀疏矩阵 我想生成这样一个矩阵,只选择有效的响应df$response并将剩余的不匹配值保留为NA: 这看起来很简单,但我尝试了几个for循环,没有一个返回我需要的。你能帮我做这个吗?非常感谢我们使用“df”中的行序列创建一个行/列索引,并匹配“Data_ID”和“sparse”的列名,以创建一个两列行/列索引矩阵,获取“sparse”的对应元素,并将其分配给“df”的“R

我想通过将df$Data_ID中每个项目的名称与下面创建的稀疏矩阵的列名相匹配,然后选择df$Response的相应值来填充稀疏矩阵

我想生成这样一个矩阵,只选择有效的响应df$response并将剩余的不匹配值保留为NA:


这看起来很简单,但我尝试了几个for循环,没有一个返回我需要的。你能帮我做这个吗?非常感谢

我们使用“df”中的行序列创建一个行/列索引,并匹配“Data_ID”和“sparse”的列名,以创建一个两列行/列索引矩阵,获取“sparse”的对应元素,并将其分配给“df”的“Response”列

sparse[cbind(seq_len(nrow(df)), 
      match(df$Data_ID, colnames(sparse)))] <- df$Response
如果OP想要一个for循环


我们使用“df”中的行序列创建一个行/列索引,并匹配“Data_ID”和“sparse”的列名,以创建一个两列行/列索引矩阵,获取“sparse”的对应元素,并将其分配给“df”的“Response”列

sparse[cbind(seq_len(nrow(df)), 
      match(df$Data_ID, colnames(sparse)))] <- df$Response
如果OP想要一个for循环

这里有一个for循环,它按照您的要求执行,因为它被标记为for循环:

这里有一个for循环,它按照您的要求执行,因为它被标记为for循环:


我想你可能把事情弄得更复杂了。基本上,您正在尝试将长数据转换为宽数据。这可以通过重塑2包中的dcast函数实现


dcast获取一个数据帧(在您的例子中是df),然后获取一个公式,用于将数据帧转换为宽格式。~的左边是要作为行的变量,右边是要作为列的变量。value.var=参数决定了哪些值填充了每一行/列组合。

我认为您可能使这一点变得比实际需要的更复杂。基本上,您正在尝试将长数据转换为宽数据。这可以通过重塑2包中的dcast函数实现


dcast获取一个数据帧(在您的例子中是df),然后获取一个公式,用于将数据帧转换为宽格式。~的左边是要作为行的变量,右边是要作为列的变量。Value=参数确定每个行/列组合填充的值。请考虑检查@ USER 181868。请考虑检查是否真的想要稀疏矩阵作为输出,另一个替代方案是XTabsReest-SEQALeNNRODFF+DATAYID,DATA=DF,稀疏= TtrueIf,如果您实际上想要稀疏矩阵作为输出,另一种选择是xtabsResponse~seq_lennrowdf+Data_ID,Data=df,sparse=TRUE
sparse
#      Item_1 Item_2 Item_3 Item_4 Item_5 Item_6 Item_7
# [1,]      0     NA     NA     NA     NA     NA     NA
# [2,]     NA     NA      0     NA     NA     NA     NA
# [3,]     NA     NA     NA     NA      1     NA     NA
# [4,]     NA     NA     NA     NA     NA     NA      1
# [5,]     NA     NA     NA      0     NA     NA     NA
# [6,]     NA     NA     NA     NA     NA      0     NA
# [7,]     NA     NA      1     NA     NA     NA     NA
# [8,]     NA      0     NA     NA     NA     NA     NA
# [9,]     NA     NA      1     NA     NA     NA     NA
for(i in seq_len(nrow(sparse))) sparse[i, df$Data_ID[i]] <- df$Response[i]
matched <- match(df$Data_ID,colnames(sparse))
for (i in 1:nrow(df)) {
  sparse[i,matched[i]] <- df$Response[i]
}
sparse
      Item_1 Item_2 Item_3 Item_4 Item_5 Item_6 Item_7
 [1,]      0     NA     NA     NA     NA     NA     NA
 [2,]     NA     NA      0     NA     NA     NA     NA
 [3,]     NA     NA     NA     NA      1     NA     NA
 [4,]     NA     NA     NA     NA     NA     NA      1
 [5,]     NA     NA     NA      0     NA     NA     NA
 [6,]     NA     NA     NA     NA     NA      0     NA
 [7,]     NA     NA      1     NA     NA     NA     NA
 [8,]     NA      0     NA     NA     NA     NA     NA
 [9,]     NA     NA      1     NA     NA     NA     NA
library(reshape2)
df <- data.frame(Data_ID=c("Item_1","Item_3","Item_5","Item_7","Item_4","Item_6","Item_3","Item_2","Item_3"),Response= c(0,0,1,1,0,0,1,0,1))
df[,"rows"]<-c(1:nrow(df))

sparse<-dcast(df,rows~Data_ID, value.var="Response")
sparse<-as.matrix(sparse[,-1]) #Just to get rid of the column title "Row" and to convert to a matrix format
print(sparse)