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