2017-12-25 15 views
2

데이터 프레임에서 하나의 변수로 행렬을 만들고 싶습니다.R 하나의 변수에서 행렬을 생성하십시오.

sum(Rin1,Rin2)/sum(Rin),...,sum(Rin1,Rin28)/sum(Rin) 
sum(Rin2,Rin3)/sum(Rin),...,sum(Rin2,Rin28)/sum(Rin) 

나는이 스크립트를 사용하지만 나를 위해 작동하지 않았다 : 행렬의 각 셀은 다음과 같이 채워집니다

# Keep one column that has proportion of Rin=Tdin/User.in 
df.in <- df[,c(5)] 
# Create matrix for rows' combination 
a<-t(combn(28,2)) 
# Create empty matrix according length of rows 
output <- matrix ('',28,28) 
# Fill matrix with sum of rows divide sum of Rin 
for (i in 1:nrow(a)) { 
    # I came up with this line from my previous work! 
    output[cbind(a[i,][1],a[i,][2])] <-unlist(intersect(df.in[a[i,]][1],df.in[a[i,]][2])) 
} 

감사합니다 사전에 어떤 제안을 위해.

샘플 데이터 프레임 :

df <- structure(list(Subject = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
              1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
              1L, 1L, 1L, 1L, 1L, 1L), 
       .Label = c("Political.Issue", "Women.s.Rights", "Workers..Rights"), 
       class = "factor"), Kcore.in = c(0, 1, 2,3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 21, 
       22, 25,28, 30, 39, 40, 41, 42, 44, 82), Tdin = c(2090, 3217, 6110, 32427,6612, 3425, 11940, 
       17985, 1998, 882, 8661, 3228, 701, 656, 269,393, 7737, 339, 6456, 1950, 99, 302, 43320, 1087, 
       3655, 2103,562, 2135), User.in = c(4723L, 183L, 87L, 62L, 24L, 13L, 13L,25L, 7L, 2L, 9L, 9L, 
       2L, 2L, 1L, 1L, 13L, 2L, 3L, 3L, 1L, 1L,4L, 1L, 2L, 2L, 1L, 2L), Rin = c(0.442515350412873, 
       17.5792349726776,70.2298850574713, 523.016129032258, 275.5, 263.461538461538,918.461538461538, 
       719.4, 285.428571428571, 441, 962.333333333333,358.666666666667, 350.5, 328, 269, 393, 595.153846153846, 
       169.5,2152, 650, 99, 302, 10830, 1087, 1827.5, 1051.5, 562, 1067.5)), .Names = c("Subject","Kcore.in", "Tdin", 
       "User.in", "Rin"), row.names = c(NA, -28L), class = c("grouped_df", "tbl_df", "tbl", "data.frame"), vars = "Subject", 
       drop = TRUE, indices = list(0:27), group_sizes = 28L, biggest_group_size = 28L, labels = structure(list(Subject = 
       structure(1L, .Label = c("Political.Issue", "Women.s.Rights","Workers..Rights"), class = "factor")), 
       row.names = c(NA,-1L), class = "data.frame", vars = "Subject", drop = TRUE, .Names = "Subject")) 
+0

'외측 ($ 린, DF $ 린 DF '+') ($ 린 DF)/합'또는'($ 린 + 매트릭스 ($ 린 DF, NR = 길이 DF ($ 린 DF) , nc = 길이 (df $ Rin), byrow = TRUE))/sum (df $ Rin)' – user20650

답변

3

이 당신이 원하는 무엇인가?

out <- matrix(NA, nrow = dim(df)[1], ncol = dim(df)[1]) 

sum <- sum(df$Rin) 
for (t1 in 1:dim(df)[1]){ 
    for (t2 in 1:dim(df)[1]){ 
    out[t1, t2] <- sum(df$Rin[t1], df$Rin[t2])/sum 
    } 
} 
+0

안녕하세요 @PejoPhylo. 출력을 확인했는데 올바른 번호를주지 못했습니다. 예를 들어; 행렬 [3,2]의 숫자는 87.80912이지만 0.00330이어야합니다. Rin의 Row 2는 17.5792350이고 Rin의 Row 3은 70.2298851이므로 행렬 [3,2]에서이 두 행의 교집합은 [(70.22 + 17.57) /26569.17] = 0.0033이어야합니다. 이 설명이 당신에게 명확 해지기를 바랍니다. – eabanoz

+0

나쁘다. 각 항목을 합계로 나누는 것을 잊었다. 나는 내 대답을 편집했다. 이제는 정확해야합니다. – PejoPhylo

+1

추 신 : 행렬의 완전한 복사를 피하기 위해'NA'가 아닌'matrix (NA_real_, ...) '를 사용하고 싶습니다. http://www.jottr.org/2014/06/matrixNA-wrong-way.html을 참조하십시오. – HenrikB