2016-10-04 1 views
0

위해 나는 다음과 같은 데이터를 가지고 :R은 1 열에 3 열을 축소하는 데이터를 녹여 두 번 각 행

df1 
id count white_v pink_v others_v 
1 1  0.4  0.5 0.6 
1 2  0.5  0.5 0.747 
1 3  0.87  0.57 0.87 
2 1  1.5  2.5 1.2 
.... 

을하고 난에 호환되는 방식으로 데이터를 재 형성 할 다음과 같은 형식의 다른 데이터 프레임 :

df2 
    id count white pink 
    1 1 1  0 
    1 1 0  1 
    1 1 0  0 
    1 1 1  0 
    1 1 0  1 
    1 1 0  0 

그래서 기본적으로 내가 DF2하는 DF1에서 분홍색, 흰색, 다른 사람의 값을 추가하고 싶지만, DF2는 각 색상 코딩 더미이는 방식으로 서식 (0 , 분홍색과 흰색 모두에서 0은 그 컬럼이 다른 컬럼을 의미 함을 의미합니다). 그리고 각 고객의 각 구입, DF2은 처음 세 행의 반복되는과 그 6 개 행이 첫 번째 3. 내가 달성하고자하는 것은 다음과 같은 데이터 프레임

:

df3 
id count white pink v 
    1 1 1  0  0.4 -> indicates the value of white_v for id 1,count1 
    1 1 0  1  0.5 -> indicates the value of pink_v for id 1, count1 
    1 1 0  0  0.6 -> indicates the value of others_v for id 1, count1 
    1 1 1  0  0.4 -> indicates the value of white_v for id 1,count1 
    1 1 0  1  0.5 -> similarly as above 
    1 1 0  0  0.6 

각 사람을 통해 반복하고 각 구매 횟수를 알아볼 필요가 있습니다. 내가 루프를 사용하여 생각했지만 df1과 df2의 행을 색인하기 위해 i를 사용하는 방법에 관해서는 고생했다. 그렇다면 나는 또한 모양을 사용하는 것에 대해 생각했지만 어떻게 할 수 있는지 잘 모르겠습니다.

통찰력을 크게 주셔서 감사합니다. 내 의견으로는, 그 (DF2의 형식)에서

tidyr 및 dplyr와
+0

나쁜 생각입니다. 여분의 0/1 바 대신 "흰색", "분홍색"또는 "기타"의 요소 열을 갖는 것이 훨씬 좋습니다. – Frank

답변

2

,

library(tidyverse) 

     # gather colors into long key and value columns 
df1 %>% gather(color, v, white_v:others_v) %>% 
    # drop "_v" endings; use regex if you prefer 
    separate(color, 'color', extra = 'drop') %>% 
    # add a vector of 1s to spread 
    mutate(n = 1) %>% # more robust: count(id, count, color, v) 
    # spread labels and 1s to wide form 
    spread(color, n, fill = 0) 

## id count  v others pink white 
## 1 1  1 0.400  0 0  1 
## 2 1  1 0.500  0 1  0 
## 3 1  1 0.600  1 0  0 
## 4 1  2 0.500  0 1  1 
## 5 1  2 0.747  1 0  0 
## 6 1  3 0.570  0 1  0 
## 7 1  3 0.870  1 0  1 
## 8 2  1 1.200  1 0  0 
## 9 2  1 1.500  0 0  1 
## 10 2  1 2.500  0 1  0 
+0

하지만 원하는 결과는 처음 세 행을 얻은 후에 3 행을 한 번 반복 한 다음 계속합니다 ... df3의 형식이 내가 원하는 것입니다 – lll

+0

수작업으로 줄을 만들어 실제로는 정말 나쁜 생각. 대신에 조인을 사용하십시오. 프랭크가 언급했듯이, 그것은 아마 긴 형태로 쉬울 것입니다. – alistaire

+0

또 다른 흥미로운 대안은'df1 %> % gather (color, v, white_v : others_v) %> model.matrix (~ .1, data =.) %> % as.data.frame()' – alistaire

관련 문제