2017-01-21 87 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