将单元格值从一个时间戳移位到R中的另一个时间戳

时间:2017-10-10 15:27:12

标签: r time-series

是否可以将列中一个单元格的数据从一个时间戳移位到时间序列数据中的另一个时间戳而不会丢失任何其他数据?我尝试过移位和滑动功能,但它用NA值替换数据。 我也试过使用mutate函数,但是它改变了完整的列。是否有任何函数或方法来执行操作?

例如,转换:

Date_Time  | x | y    
01-01-2016 | 1 | 2    
02-01-2016 | 3 | 4
03-01-2016 | 5 | 6 
04-01-2016 | 2 | 5

为:

Date_Time  | x | y
01-01-2016 | 5 | 2
02-01-2016 | 3 | 4
03-01-2016 | 1 | 6
04-01-2016 | 2 | 5

或垂直滑动数据

Date_Time  | x | y
01-01-2016 | 2 | 2
02-01-2016 | 1 | 4
03-01-2016 | 3 | 6
04-01-2016 | 5 | 5

2 个答案:

答案 0 :(得分:0)

两个交换两个值,您需要在临时变量中保存一个值。我们可以编写一个简单的函数:

swap = function(x, i, j) {
  stopifnot(length(i) == length(j))
  temp = x[i]
  x[i] = x[j]
  x[j] = temp
  return(x)
}

在您的数据上,它应该像这样工作以提供所需的结果:

your_data$x = swap(your_data$x, which.min(your_data$x), which.max(your_data$x))

答案 1 :(得分:0)

dplyr的其他两个选项:

library(dplyr)

df %>% 
  mutate(x = case_when(
    x == max(x) ~ min(x),
    x == min(x) ~ max(x),
    TRUE ~ x
  ))

df %>% 
  mutate(x = replace(x, c(which.max(x), which.min(x)), c(min(x), max(x))))

<强>结果:

    Date_Time x y
1 01-01-2016  5 2
2 02-01-2016  3 4
3 03-01-2016  1 6
4 04-01-2016  2 5

垂直移动x

df %>%
  mutate(x = c(x[-1], x[1]))

df %>%
  mutate(x = c(x[length(x)], x[-length(x)]))

<强>结果:

> df %>%
+   mutate(x = c(x[-1], x[1]))
    Date_Time x y
1 01-01-2016  3 2
2 02-01-2016  5 4
3 03-01-2016  2 6
4 04-01-2016  1 5

> df %>%
+   mutate(x = c(x[length(x)], x[-length(x)]))
    Date_Time x y
1 01-01-2016  2 2
2 02-01-2016  1 4
3 03-01-2016  3 6
4 04-01-2016  5 5

数据:

df = read.table(text = "Date_Time  | x | y    
01-01-2016 | 1 | 2    
02-01-2016 | 3 | 4
03-01-2016 | 5 | 6 
04-01-2016 | 2 | 5", header = TRUE, sep = "|")