2017-01-21 115 views
1

我的數據的一部分設置ř格式問題

lat_orig long_orig unit value Ag As Au Cu Fe Mn Pb 
1: 40.5525 -106.7736 ppm -0.02 0 0 1 0 0 0 0 
2: 40.5525 -106.7736 ppm 15.00 0 0 0 1 0 0 0 
3: 40.5525 -106.7736 ppm 1000.00 0 0 0 0 1 0 0 
4: 40.5525 -106.7736 ppm -0.50 1 0 0 0 0 0 0 
5: 40.5525 -106.7736 ppm 30.00 0 0 0 0 0 0 1 

行我想具有VARS(AG,如,金,銅,鐵,錳,鉛)時等於1由被取代值列中的相應值。然後摺疊所有的行,所以我只對每個lat_orig和long_orig有一行(注意所有的lat和long都是一樣的)。這只是我整體數據的一小部分。

我不確定是否會開始,任何幫助將不勝感激。

所需的輸出

lat_orig long_orig unit Ag As Au  Cu  Fe  Mn Pb 
1: 40.5525 -106.7736 ppm -0.50 0  -0.02 15.00 1000.00 0 30.00 

回答

2

我們可以用一個melt/dcast。假設數據集作爲data.table,它meltfilter符合條件轉換爲「長」格式把所有的變量,然後從「長」到「寬」

library(data.table) 
dcast(melt(DT, id.var = 1:4, value.name = "val" 
    )[, if(any(val==1)) .SD[val==1] else .SD[1L] , variable 
    ][, value:= value*val], lat_orig+long_orig+unit~variable, value = "value") 
# lat_orig long_orig unit Ag As Au Cu Fe Mn Pb 
#1: 40.5525 -106.7736 ppm -0.5 0 -0.02 15 1000 0 30 
2

一個tidyverse選項dcast

library(dplyr) 

df %>% mutate_at(vars(Ag:Pb), funs(. * value)) %>% # replace 1s with `value` 
    group_by(lat_orig, long_orig, unit) %>% # group by non-value columns 
    summarise_at(vars(-value), sum) # take sums of element columns 

## Source: local data frame [1 x 10] 
## Groups: lat_orig, long_orig [?] 
## 
## lat_orig long_orig unit Ag As Au Cu Fe Mn Pb 
##  <dbl>  <dbl> <fctr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
## 1 40.5525 -106.7736 ppm -0.5  0 -0.02 15 1000  0 30