R时间步减法

时间:2017-11-20 17:49:15

标签: r

我正在尝试构建用于分析长期数据的代码,这些数据将不断添加到当前数据中的ID中,并且可能会添加其他ID。因此,我希望确保每次向其添加更多数据时都不必大幅更改代码。我已经使用dplyr来扩展和按列减去,但这并不可行,因为数据变得更长,因为每次都必须修改代码。

以下是数据的子集:

public class DataActivity extends FragmentActivity implements **com.google.android.gms.location.LocationListener**, ConnectionCallbacks , OnConnectionFailedListener, OnMapReadyCallback{

我试图通过pinid顺序减去这些值,这样我就可以得到t1-t0,t2-t1等...如果我可以使用顺序日期而不是时间步长,那么时间步长更好在数据输入过程中输入的另一件事,或者如果它与时间步长一起作为数字,我可能也可以使它工作。

目前,我使用此question的一些代码取得了一些成功:

    data<-structure(list(pinid = structure(c(1L, 2L, 1L, 2L, 1L, 2L), .Label 
    = c("CP_South_1_1", "CP_South_1_2"), class = "factor"), reading_date = 
    structure(c(16308, 16308, 16531, 16531, 16728, 16728), class = "Date"), 
    timestep = c("t0", "t0", "t1", "t1", "t2", "t2"), measurement = c(189, 
    186, 187, 185, 184, 181)), .Names = c("pinid", "reading_date", 
    "timestep", "measurement"), row.names = c(NA, -6L), class = 
    "data.frame")

然而,结果给了我绝对值,并在一个块中吐出来重复自己看起来像这样:

    pin_dif <- function(x) setNames(
      data.frame(pinid = x$pinid, as.list(- combn(x$measurement, 2, diff))),
      c("pinid", combn(x$timestep, 2, paste, collapse = "_"))
    )
    by(data, data$pinid, pin_dif)

理想情况下,它会在数据框中吐出结果,如下所示:

    data$pinid: CP_South_1_1
             pinid t0_t1 t0_t2 t1_t2
    1 CP_South_1_1     2     5     3
    2 CP_South_1_1     2     5     3
    3 CP_South_1_1     2     5     3
    ------------------------------------------------------------------------
    data$pinid: CP_South_1_2
             pinid t0_t1 t0_t2 t1_t2
    1 CP_South_1_2     1     5     4
    2 CP_South_1_2     1     5     4
    3 CP_South_1_2     1     5     4

为了减少处理时间,我也不希望减去每个值的组合。在这个较小的数据集中只有一个额外的(t0-t2),但是由于你有更多的时间步,所以我不需要更多的值。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我建议你使用data.table。这将使操作更容易。

您可以根据自己的喜好调整以下脚本(减少组合等)并将其包装在函数中。

data <- data %>% as.data.table()
data <- data %>% dcast.data.table(formula = pinid~timestep, value.var = "measurement")
data2 <- data %>% copy()

combs <- expand.grid(names(data[,2:ncol(data)]),names(data[,2:ncol(data)])) %>% as.data.table()
combs <- combs[Var2 %>% as.character()>Var1 %>% as.character()][,var3:=paste(Var1, Var2, sep = "_")]

for (i in combs$var3){ # i <- combs$var3[1];i
data2[, (i) := get(word(string = i,start = 2,sep = "_")) - get(word(string = i,start = 1,sep = "_"))]
}
names_vars <- names(data[, 2:ncol(data)])
data2 <- data2[, !names_vars, with = F]

 data2
          pinid t0_t1 t0_t2 t1_t2
1: CP_South_1_1    -2    -5    -3
2: CP_South_1_2    -1    -5    -4

答案 1 :(得分:0)

尝试使用此方法

select distinct ps_product_shop.id_product, name, ps_product.id_category_default from ps_product_shop
INNER JOIN ps_product ON ps_product_shop.id_product = ps_product.id_product
INNER JOIN ps_product_lang ON ps_product_shop.id_product = ps_product_lang.id_product


UPDATE ps_product, ps_product_shop
SET id_category_default = '114'
WHERE name LIKE "%acana%" AND
ps_product.id_category_default LIKE "%111%";

输出

library(tidyverse)
data %>%
  group_by(pinid) %>%
  arrange(pinid, timestep) %>%
  nest(timestep, measurement) %>%
  mutate(data = map(data, ~data.frame(key = paste(combn(.x$timestep, 2)[1,], combn(.x$timestep, 2)[2,], sep="_"),
                          value = combn(.x$measurement, 2)[2,] - combn(.x$measurement, 2)[1,]))) %>%
  unnest() %>%
  spread(key, value)