R - заполнить строки столбца вниз на основе другой строки в другом столбце - PullRequest
0 голосов
/ 25 июня 2018

Я читаю данные JSON в RStudio, которые поступают от датчиков, проезжающих по городу.Затем я преобразую эти данные в массив данных с пакетом диван и jsonlite.данные в основном представляют собой данные датчика, которые состоят из данных местоположения, и для каждого измерения местоположения имеются некоторые данные об окружающей среде, передаваемые и кодируемые в путях ресурсов, например (/ 6/0/0 и / 6/0/1 для информации о широте и долготе)- из-за данных JSON, в которых я читаю, информация о местоположении в моем кадре данных R находится в том же столбце «значения», что и данные об окружающей среде, такие как влажность, CO2 и т. д., поэтому я теряю информацию о местоположении для отдельных наблюдений, как местоположениеИнформация также рассматривается как значение.см. преобразованный файл JSON data.frame ниже

data.frame

> |------------------------------------------------------- |    
> resourcePath    |     value  |UTC       |lat     |long . |
>   
> /6/0/0          |    48.18   |14:51:43 |  0     | 0      |
> |---------------|------------|---------|--------|--------|   
> /6/0/1          |    16.39   |14:51:43 |  0     | 0      |
> |---------------|------------|---------|--------|--------|   
> /3300/515/5700  |         34 |14:52:43 |  0     | 0      |
> |---------------|------------|---------|--------|--------|   
> /3300/289/5700  |         15 |14:53:43 |  0     | 0      |
> |---------------|------------|---------|--------|--------|   
> /3300/515/5700  |        55  |4:53:47  |  0     | 0      |
> |---------------|------------|---------|--------|--------|   
> /3300/289/5700  |       9004 |14:54:23 |  0     | 0      |
> |---------------|------------|---------|--------|--------|   
> /3304/0/5700    |       367  | 14:54:34| 0      |0       |
> |---------------|------------|---------|--------|--------|   
> /3315/0/5700    |         47 |14:54:54 | 0      |0       |
> |---------------|------------|---------|--------|--------|   
> /6/0/0          |     50.34  |14:57:11 |0       | 0      |
> |---------------|------------|---------|--------|--------|   
> /6/0/1          |     20.52  |14:57:13 |0       | 0      |
> |---------------|------------|---------|--------|--------|   
> /3304/0/5700    |         84 |14:57:34 |0       | 0      |
> |---------------|------------|---------|--------|--------|   
> /3315/0/5700    |         56 |14:57:45    0       0      |

А здесь приведен вид требуемого кадра данных.

[этотребуемый df - каждая строка имеет связанную информацию «lat» и «long» - в зависимости от значения в столбце «value», если в столбце «value» есть новое значение.] [2]

> |------------------------------------------------------- |    
> resourcePath    |     value  |UTC       |lat     |long . |
>   
> /6/0/0          |    48.18   |14:51:43 |  48.18 | 16.39  |
> |---------------|------------|---------|--------|--------|   
> /6/0/1          |    16.39   |14:51:43 |  48.18 | 16.39  |
> |---------------|------------|---------|--------|--------|   
> /3300/515/5700  |         34 |14:52:43 |  48.18 | 16.39  |
> |---------------|------------|---------|--------|--------|   
> /3300/289/5700  |         15 |14:53:43 |  48.18 | 16.39  |
> |---------------|------------|---------|--------|--------|   
> /3300/515/5700  |        55  |4:53:47  |  48.18 | 16.39  |
> |---------------|------------|---------|--------|--------|   
> /3300/289/5700  |       9004 |14:54:23 |  48.18 | 16.39  |
> |---------------|------------|---------|--------|--------|   
> /3304/0/5700    |       367  | 14:54:34| 48.18  |16.39   |
> |---------------|------------|---------|--------|--------|   
> /3315/0/5700    |         47 |14:54:54 | 48.18  |16.39   |
> |---------------|------------|---------|--------|--------|   
> /6/0/0          |     50.34  |14:57:11 |50.34   | 20.52  |
> |---------------|------------|---------|--------|--------|   
> /6/0/1          |     20.52  |14:57:13 |50.34   | 20.52  |
> |---------------|------------|---------|--------|--------|   
> /3304/0/5700    |         84 |14:57:34 |50.34   | 20.52  |
> |---------------|------------|---------|--------|--------|   
> /3315/0/5700    |         56 |14:57:45    50.34   20.52  |

Я зациклился - использовал lapply, но в настоящее время я не получаю желаемый df.Любые намеки широко приветствуются.Thomas

1 Ответ

0 голосов
/ 25 июня 2018

Вот решение с использованием пакета tidyr. При этом предполагается, что первая строка каждой группировки данных является строкой "/ 6/0/0", а вторая строка - "/6/0/1".

df<-structure(list(resourcePath = structure(c(5L, 6L, 2L, 1L, 2L, 
1L, 3L, 4L, 5L, 6L, 3L, 4L), .Label = c("/3300/289/5700", "/3300/515/5700", 
"/3304/0/5700", "/3315/0/5700", "/6/0/0", "/6/0/1"), class = "factor"), 
    value = c(48.18, 16.39, 34, 15, 55, 9004, 367, 47, 50.34, 
    20.52, 84, 56), UTC = structure(c(1L, 1L, 2L, 3L, 4L, 5L, 
    6L, 7L, 8L, 9L, 10L, 11L), .Label = c("14:51:43", "14:52:43", 
    "14:53:43", "14:53:47", "14:54:23", "14:54:34", "14:54:54", 
    "14:57:11", "14:57:13", "14:57:34", "14:57:45"), class = "factor"), 
    lat = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), 
    long = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("resourcePath", 
"value", "UTC", "lat", "long"), class = "data.frame", row.names = c(NA, 
-12L))    

f$resourcePath<-as.character(df$resourcePath)

#reset lat and long columns to NA for the fill command
df$lat<-NA
df$long <- NA

#find rows with the lat resource
#assumes this is the first row of each data grouping
latrows<-which(df$resourcePath=="/6/0/0")
df$lat[latrows]<-df$value[latrows]
df$long[latrows]<-df$value[(latrows+1)]

library(tidyr)  #needed for the fill function
df<-fill(df, lat, long)

Редактирование заметки: это улучшение производительности по сравнению с первоначальной версией, при условии, что порядок данных в кадре данных согласован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...