2017-10-17 3 views
0

내 df에서 열 (t & s)과 행 (깊이, 온도 & sal)을 모두 사용해야하는 하위 집합 (depth1 : depthN over nm1 : nmN)에 함수를 적용해야합니다. 내 실제 데이터는 28-128 행에 의해 170 열이 있습니다. I과 같은 공식을 계산하고자 :dplyr에서 LUT를 통합하는 방법은 무엇입니까?

x = z- [temp * (temp - tdev) + s * sal] 

어디 Z 그 관측 값

df <- matrix(c( 
1.0277, 1.0051, 1.0059, 1.003, 1.009, 1.00E-04, -1.20E-05, 
1.0019, 0.9841, 0.9769, 0.9809, 0.9815, 9.00E-05, -1.80E-05, 
0.9755, 0.9601, 0.9531, 0.9587, 0.955, 6.00E-05, -2.00E-05, 
0.9522, 0.9364, 0.9296, 0.9322, 0.931, 2.00E-05, -2.00E-05, 
0.2, 0.4, 0.6, 0.8, 1, NA, NA, 
15.327, 15.336, 15.356, 15.342, 14.853, NA, NA, 
14.908, 14.916, 14.912, 14.9, 17.95, NA, NA 
), nrow = 7, ncol = 7, byrow = TRUE, 
dimnames = list(c("nm1","nm2","nm3","nm4","depth","temp","sal"), 
      c("depth1","depth2","depth3","depth4","depth5","t","s"))) 


    df 
     depth1 depth2 depth3 depth4 depth5  t   s 
nm1 1.0277 1.0051 1.0059 1.003 1.009 1.00E-04 -1.20E-05 
nm2 1.0019 0.9841 0.9769 0.9809 0.9815 9.00E-05 -1.80E-05 
nm3 0.9755 0.9601 0.9531 0.9587 0.955 6.00E-05 -2.00E-05 
nm4 0.9522 0.9364 0.9296 0.9322 0.931 2.00E-05 -2.00E-05 
depth 0.2  0.4  0.6  0.8  1  NA   NA 
temp 15.327 15.336 15.356 15.342 14.853 NA   NA 
sal 14.908 14.916 14.912 14.95 17.95 NA   NA 

I이 방정식에서 사용되는 행 (깊이 임시 &가 더 좋을 수 있다는 생각 다른 DF (DF2의 SAL)) 변수를 대응 제 그들을 놓기 depth1 : DepthN 아래와 같은 LUT로서 사용하여, I는 dplyr 이것을 시도

nm <- c("nm1", "nm2","nm3","nm4") 
df1<-df[nm, ] 

df1 
     depth1 depth2 depth3 depth4 depth5  t   s 
nm1 1.0277 1.0051 1.0059 1.003 1.009 1.00E-04 -1.20E-05 
nm2 1.0019 0.9841 0.9769 0.9809 0.9815 9.00E-05 -1.80E-05 
nm3 0.9755 0.9601 0.9531 0.9587 0.955 6.00E-05 -2.00E-05 
nm4 0.9522 0.9364 0.9296 0.9322 0.931 2.00E-05 -2.00E-05 

list2 <- c("depth", "temp","sal") 
df2 <- subset(df,rownames(df) %in% list2, select = depth1:depth5) 

df2 depth1 depth2 depth3 depth4 depth5 
depth 0.2  0.4  0.6  0.8  1  
temp 15.327 15.336 15.356 15.342 14.853 
    sal 14.908 14.916 14.912 14.95 17.95 

성공 :

tdev <- 17.2 
    df3<-transmute_at(df, vars(depth1:depth5), funs(.-abs(t*(df2[2,]- tdev)+s*df2[3,]))) 

누구에게도 해결책이 있습니까?

답변

0

이것은 일부 데이터 청소 장치를 필요로 :

library(tidyverse) 
df <- as.data.frame(df) %>% 
    rownames_to_column %>% 
    as_tibble #convert to tibble (not sure why you'd want a matrix?) 

이것은 당신이 t 및 TDEV 같은 일이고, 당신은 어떤 그룹이 필요한 경우인지 아닌지 확실하지 ... 필요가 있으리라 믿고있어 무엇 다음이다.

df %>% 
    dplyr::filter(rowname != "depth", 
       rowname != "temp", 
       rowname != "sal") %>% 
    gather(var, z, -rowname, -t, -s) %>% ## filter from wide to long (i.e. tidy) format 
    full_join(df %>% 
       dplyr::select(-t, -s) %>% 
       dplyr::filter(!grepl("nm", rowname)) %>% 
       gather(var, val, -rowname) %>% 
       spread(key = rowname, val)) %>% ## join to the rest of your df 
    mutate(x = z- (temp * (temp - t) + s * sal)) 
+0

예! @biomiha 감사합니다! 이게 내가 원했던 것이고, 쉬운 방법으로 df를 긴 형식으로 변환하는 방법을 알지 못했다. 그리고 나서 나는 LUT를 생각하려고했다. t는 df에서 가져온 것이지만 tdev는 고정 된 값을 갖는 상수이기 때문에 마지막 줄에는 mutate (x = z- (t * (temp-tdev) + s * sal))가 필요합니다. 다시 한 번 감사드립니다. 이렇게하면 데이터를 처리하는 데 많은 시간을 절약 할 수 있습니다! –

관련 문제