2017-12-30 4 views
0

안녕하세요이 다음 dataframe :이 같은 것을 가지고 그것을 바꿀 필요가R- 재편 데이터를 두 개의 열이 1

 Date   S1 Mavg1   STdev1   S2  Mavg2  STdev2 
1 02/12/1999 -0.000217052 0.002862195 -0.002390842 2.2025825 -1.17258213 -0.3057015 
2 03/12/1999 -0.004882038 -0.015920939 -0.007014382 -0.4040079 -0.69496488 0.1000167 
3 06/12/1999 -0.001445954 0.005077610 0.000000000 1.1573779 -1.64268166 -0.3847015 
4 07/12/1999 -0.000907952 -0.005403168 0.002027728 -0.3165827 -1.16466940 -1.0113501 
5 08/12/1999 0.000881220 0.011375226 -0.013524439 0.5154455 -0.51725208 1.0942177 
6 09/12/1999 0.001043752 0.013400502 0.017033342 1.9368608 -0.05587143 0.5203337 

:

  Date S variable  value 
1 02/12/1999 S1 value -0.000217052 
2 03/12/1999 S1 value -0.004882038 
3 06/12/1999 S1 value -0.001445954 
4 07/12/1999 S1 value -0.000907952 
5 08/12/1999 S1 value 0.000881220 
6 09/12/1999 S1 value 0.001043752 
7 02/12/1999 S2 value 2.202582500 
8 03/12/1999 S2 value -0.404007900 
9 06/12/1999 S2 value 1.157377900 
10 07/12/1999 S2 value -0.316582700 
11 08/12/1999 S2 value 0.515445500 
12 09/12/1999 S2 value 1.936860800 
13 02/12/1999 S1  mavg 0.002862195 
14 03/12/1999 S1  mavg -0.015920939 
15 06/12/1999 S1  mavg 0.005077610 
16 07/12/1999 S1  mavg -0.005403168 
17 08/12/1999 S1  mavg 0.011375226 
18 09/12/1999 S1  mavg 0.013400502 
19 02/12/1999 S2  mavg -1.172582130 
20 03/12/1999 S2  mavg -0.694964880 
21 06/12/1999 S2  mavg -1.642681660 
22 07/12/1999 S2  mavg -1.164669400 
23 08/12/1999 S2  mavg -0.517252080 
24 09/12/1999 S2  mavg -0.055871430 
25 02/12/1999 S1 stddev -0.002390842 
26 03/12/1999 S1 stddev -0.007014382 
27 06/12/1999 S1 stddev 0.000000000 
28 07/12/1999 S1 stddev 0.002027728 
29 08/12/1999 S1 stddev -0.013524439 
30 09/12/1999 S1 stddev 0.017033342 
31 02/12/1999 S2 stddev -0.305701500 
32 03/12/1999 S2 stddev 0.100016700 
33 06/12/1999 S2 stddev -0.384701500 
34 07/12/1999 S2 stddev -1.011350100 
35 08/12/1999 S2 stddev 1.094217700 
36 09/12/1999 S2 stddev 0.520333700 

내가 용융를 사용해야 알을하지만, 나는 이것을 어떻게하는지 모른다. 나는 그것이해야한다고 생각 .................)

+0

? 귀하의 예를 [붙이기 쉬운 양식] (https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)으로 제공 할 수 있습니까? –

+0

이것은 붙여 넣기가 쉬운 형식이고 예 1은 작동하지 않았습니다. –

답변

1
library('data.table') 
df2 <- melt(df1, id.vars = c("Date")) 
# assign values to column "S" by finding the numbers at the end of values in variable column 
# and paste it with "S" 
df2[, S := paste0("S", unlist(lapply(regmatches(variable, gregexpr('[0-9]+', variable)), tail, 1))) ] 
# find and replace S1 and S2 with "value" in variable column 
df2[variable %in% c("S1", "S2"), variable := "value"] 
df2[, variable := gsub("[0-9]", "", variable)] 
df2 
#   Date variable  value S 
# 1: 02/12/1999 value -0.000217052 S1 
# 2: 03/12/1999 value -0.004882038 S1 
# 3: 06/12/1999 value -0.001445954 S1 
# 4: 07/12/1999 value -0.000907952 S1 
# 5: 08/12/1999 value 0.000881220 S1 
# 6: 09/12/1999 value 0.001043752 S1 
# 7: 02/12/1999  Mavg 0.002862195 S1 
# 8: 03/12/1999  Mavg -0.015920939 S1 
# 9: 06/12/1999  Mavg 0.005077610 S1 
# 10: 07/12/1999  Mavg -0.005403168 S1 
# 11: 08/12/1999  Mavg 0.011375226 S1 
# 12: 09/12/1999  Mavg 0.013400502 S1 
# 13: 02/12/1999 STdev -0.002390842 S1 
# 14: 03/12/1999 STdev -0.007014382 S1 
# 15: 06/12/1999 STdev 0.000000000 S1 
# 16: 07/12/1999 STdev 0.002027728 S1 
# 17: 08/12/1999 STdev -0.013524439 S1 
# 18: 09/12/1999 STdev 0.017033342 S1 
# 19: 02/12/1999 value 2.202582500 S2 
# 20: 03/12/1999 value -0.404007900 S2 
# 21: 06/12/1999 value 1.157377900 S2 
# 22: 07/12/1999 value -0.316582700 S2 
# 23: 08/12/1999 value 0.515445500 S2 
# 24: 09/12/1999 value 1.936860800 S2 
# 25: 02/12/1999  Mavg -1.172582130 S2 
# 26: 03/12/1999  Mavg -0.694964880 S2 
# 27: 06/12/1999  Mavg -1.642681660 S2 
# 28: 07/12/1999  Mavg -1.164669400 S2 
# 29: 08/12/1999  Mavg -0.517252080 S2 
# 30: 09/12/1999  Mavg -0.055871430 S2 
# 31: 02/12/1999 STdev -0.305701500 S2 
# 32: 03/12/1999 STdev 0.100016700 S2 
# 33: 06/12/1999 STdev -0.384701500 S2 
# 34: 07/12/1999 STdev -1.011350100 S2 
# 35: 08/12/1999 STdev 1.094217700 S2 
# 36: 09/12/1999 STdev 0.520333700 S2 
#   Date variable  value S 

데이터 : 지금까지 시도 무엇

library('data.table') 
df1 <- fread('id  Date   S1 Mavg1   STdev1   S2  Mavg2  STdev2 
1 02/12/1999 -0.000217052 0.002862195 -0.002390842 2.2025825 -1.17258213 -0.3057015 
     2 03/12/1999 -0.004882038 -0.015920939 -0.007014382 -0.4040079 -0.69496488 0.1000167 
     3 06/12/1999 -0.001445954 0.005077610 0.000000000 1.1573779 -1.64268166 -0.3847015 
     4 07/12/1999 -0.000907952 -0.005403168 0.002027728 -0.3165827 -1.16466940 -1.0113501 
     5 08/12/1999 0.000881220 0.011375226 -0.013524439 0.5154455 -0.51725208 1.0942177 
     6 09/12/1999 0.001043752 0.013400502 0.017033342 1.9368608 -0.05587143 0.5203337', header = TRUE) 
df1[, id := NULL ] 
+0

출력 결과는 'STdev1' 또는'STdev2'와 같습니다. OP는'variable' 값에 숫자가없는 출력을 원했고 ;-) –

+1

'gsub'는'df2 [, variable : = gsub ("[0-9]", "variable")' – Sathish

3

을,

내가 어떤 단어를 희생 할 필요가/인터넷 신들에 대한 문자 나에게이 질문을 게시 할 수 있도록 옳은 길.

mydf %>% 
    gather(key=Variable,value=Value,c(S1, S2, Mavg1, Mavg2,STdev1,STdev2)) %>% 
    mutate(S=case_when(
     Variable=="S1"|Variable=="Mavg1"|Variable=="STdev1" ~ "S1", 
     Variable=="S2"|Variable=="Mavg2"|Variable=="STdev2" ~ "S2" 
    ), 
    Variable=str_replace_all(string=Variable,pattern="S[1|2]",replacement="Value"), 
    Variable=str_replace_all(string=Variable,pattern="[[:digit:]]",replacement="") 
    ) %>% 
    select(Date,S,Variable,Value) 

이 출력은 다음과 같습니다 : 나는 tidyverse 접근 방식을 사용했다

  Date S Variable  Value 
1 02/12/1999 S1 Value -0.000217052 
2 03/12/1999 S1 Value -0.004882038 
3 06/12/1999 S1 Value -0.001445954 
4 07/12/1999 S1 Value -0.000907952 
5 08/12/1999 S1 Value 0.000881220 
6 09/12/1999 S1 Value 0.001043752 
7 02/12/1999 S2 Value 2.202582500 
8 03/12/1999 S2 Value -0.404007900 
9 06/12/1999 S2 Value 1.157377900 
10 07/12/1999 S2 Value -0.316582700 
11 08/12/1999 S2 Value 0.515445500 
12 09/12/1999 S2 Value 1.936860800 
13 02/12/1999 S1  Mavg 0.002862195 
14 03/12/1999 S1  Mavg -0.015920939 
15 06/12/1999 S1  Mavg 0.005077610 
16 07/12/1999 S1  Mavg -0.005403168 
17 08/12/1999 S1  Mavg 0.011375226 
18 09/12/1999 S1  Mavg 0.013400502 
19 02/12/1999 S2  Mavg -1.172582130 
20 03/12/1999 S2  Mavg -0.694964880 
21 06/12/1999 S2  Mavg -1.642681660 
22 07/12/1999 S2  Mavg -1.164669400 
23 08/12/1999 S2  Mavg -0.517252080 
24 09/12/1999 S2  Mavg -0.055871430 
25 02/12/1999 S1 STdev -0.002390842 
26 03/12/1999 S1 STdev -0.007014382 
27 06/12/1999 S1 STdev 0.000000000 
28 07/12/1999 S1 STdev 0.002027728 
29 08/12/1999 S1 STdev -0.013524439 
30 09/12/1999 S1 STdev 0.017033342 
31 02/12/1999 S2 STdev -0.305701500 
32 03/12/1999 S2 STdev 0.100016700 
33 06/12/1999 S2 STdev -0.384701500 
34 07/12/1999 S2 STdev -1.011350100 
35 08/12/1999 S2 STdev 1.094217700 
36 09/12/1999 S2 STdev 0.520333700 
+0

질문에 대답합니까? 출력의 행 수를 조사하십시오. 그것은 60 행 대신 36 행으로되어 있습니다. 내 솔루션을 참조하십시오 출력에서 ​​36 행을 가지고 – Sathish

+1

@ Sathish 나는 당신이 옳다 고 생각합니다, 나는 내 코드를 재고했습니다. 이제 결과가 정확합니다. 많은 분들께 감사 드리며 –

+1

이제는 멋지게 보입니다 – Sathish

관련 문제