我正在RStudio中读取JSON数据,这些数据来自行驶中的传感器 在一个城市。 然后,我将这些数据转换为带有沙发的数据框 和jsonlite包。数据基本上是传感器数据, 由位置数据组成,对于每个位置测量, 在资源路径中传输和编码的一些环境数据,例如 (关于纬度和经度信息,分别为/ 6/0/0和/ 6/0/1)-由于 我正在读取的JSON数据,R中的位置信息 数据框与环境数据位于同一“值”列中 例如湿度,二氧化碳等,因此我松了 个别观察,因为位置信息也被视为 值。参见下面的
转换后的JSON data.framedata.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-只要“值”列中有新值,每行都有关联的“纬度”和“长”信息-取决于“值”列中的值。 ] [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。 任何提示广为赞赏。 托马斯
答案 0 :(得分:0)
这里是使用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)
编辑说明:如果数据框中的行顺序保持一致,这是对原始版本的性能改进。