2016-12-30 1 views
1

У меня есть наборы данныхdplyr манипуляции построчно группировки мутировать

x <- data.frame(Postcode = c(1, 2, 3, 4, 5, 6), 
       Latitude = c(3.1, 3.2, 3.3, 3.3, 3.4, 3.4), 
       Longitude = c(100, 101, 102, 102, 103, 104), 
       Exposure = c(1, 2, 3, 4, 5, 6)) 

Я пытаюсь манипулировать данными внутри х становится

x <- data.frame(Postcode = c(1, 2, 3, 4, 5, 6), 
       Latitude = c(3.1, 3.2, 3.3, 3.3, 3.4, 3.4), 
       Longitude = c(100, 101, 102, 102, 103, 104), 
       Exposure = c(1, 2, 3, 4, 5, 6), 
       coords = c("3.1, 100", "3.2, 101", "3.3, 102", "3.3, 102", 
          "3.4, 103", "3.4, 104"), 
       postcode = c("1", "2", "3,4", "3,4", "5", "6"), 
       exposure = c(1, 2, 7, 7, 5, 6)) 

Новый столбец postcode будет склеить в Postcode, который имеет тот же Latitude и Longitude. coords вставляет Latitude и Longitude, а exposure будет суммировать Exposure, который имеет то же самое coords, то есть то же Latitude и Longitude.

Я мог бы сделать это с помощью dplyr пакета и for цикла

x <- mutate(x, coords = paste(Latitude, Longitude, sep = ", ")) 
x <- cbind(x, postcode = rep(0, nrow(x)), exposure = rep(0, nrow(x))) 
for(i in unique(x$coords)){ 
    x$postcode[x$coords == i] <- paste(x$Postcode[x$coords == i], collapse = ", ") 
    x$exposure[x$coords == i] <- sum(x$Exposure[x$coords == i]) 
} 

Как я мог сделать это, используя только dplyr пакета только, без использования for цикла? или, может быть другой подход, который является более эффективным, чем использование for цикла, потому что мои фактические наборы данных довольно большие

+0

Второй набор данных имеет неравное количество элементов. Обновите его – akrun

+0

@akrun Я его отредактировал. Спасибо за уведомление –

+0

Он будет закрыт, если вы не исправите: Ошибка в data.frame (Postcode = c (0, 1, 2, 3, 4, 5, 6), Latitude = c (3.1,: аргументы подразумевают различное количество строк: 7, 6 – hrbrmstr

ответ

1

Вот как вы можете сделать это с dplyr:

library(dplyr) 
x %>% 
    group_by(coords = paste(Latitude, Longitude, sep = ", ")) %>% 
    mutate(postcode = toString(Postcode), exposure = sum(Exposure)) 

# Source: local data frame [6 x 7] 
# Groups: coords [5] 
# 
# Postcode Latitude Longitude Exposure coords postcode exposure 
#  <dbl> <dbl>  <dbl> <dbl> <chr> <chr> <dbl> 
# 1  1  3.1  100  1 3.1, 100  1  1 
# 2  2  3.2  101  2 3.2, 101  2  2 
# 3  3  3.3  102  3 3.3, 102  3, 4  7 
# 4  4  3.3  102  4 3.3, 102  3, 4  7 
# 5  5  3.4  103  5 3.4, 103  5  5 
# 6  6  3.4  104  6 3.4, 104  6  6 
+0

Привет, большое спасибо за ваше решение. Мои данные фактически хранятся в объекте пространственной точки данных.Я думал, что могу манипулировать им с помощью этого метода, я просто что я не мог использовать group_by для данных в объекте пространственных точек.Для какого-либо предложения? –

+0

Я думал, что сначала могу извлечь данные из объекта sp, а затем применить dplyr, но я заметил, что он изменил объект, поэтому я не мог хранить он возвращается к объекту sp –

+0

В любом случае спасибо. Я просто знаю, что вы могли бы использовать group_by таким образом. –

2
library(dplyr) 
library(tidyr) # unite() was used to join Lat, Lon 

x %>% unite(coords, Latitude, Longitude, sep = ",", remove = FALSE) %>% 
    group_by(coords) %>% mutate(exposure = sum(Postcode), postcode = toString(Postcode)) 
+0

Привет, большое спасибо за ваше решение. Мои данные фактически хранятся в объекте пространственных точек данных. Я думал, что могу манипулировать им с помощью этого метода, я просто понимаю, что я не мог использовать group_by для данных в объекте пространственных точек данных. Любое предложение? –

+0

Я думал, что сначала могу извлечь данные из объекта sp, а затем применить dplyr, но я заметил, что он изменил объект, поэтому я не смог его вернуть обратно на объект sp –

+0

actualy Я не очень много работал над объектами 'sp' , вы могли бы поделиться информацией о hwat, с которой вы сталкиваетесь –

1

Мы можем сделать это с data.table

library(data.table) 
setDT(x)[, coords := paste(Latitude, Longitude, sep=",") 
    ][, c("exposure", "postcode") :=.(sum(Postcode), toString(Postcode)), coords] 
x 
# Postcode Latitude Longitude Exposure coords exposure postcode 
#1:  1  3.1  100  1 3.1,100  1  1 
#2:  2  3.2  101  2 3.2,101  2  2 
#3:  3  3.3  102  3 3.3,102  7  3, 4 
#4:  4  3.3  102  4 3.3,102  7  3, 4 
#5:  5  3.4  103  5 3.4,103  5  5 
#6:  6  3.4  104  6 3.4,104  6  6