在R中的数据框中移动值

时间:2018-08-06 15:25:21

标签: r dataframe shift

我有一个数据框:

dt <- read.table(text = "
0 344 34 0 0
0 350 16 0 0
0 366 11 0 0
0 376 8  0 0
0 380 28 0 0
0 397 55 0 0
0 398 45 0 0  
0 400 19 0 0 
0 402 30 0 0")

我想随机向右移动1/3行一列,例如:

dt1 <- read.table(text = "
0 344 34 0 0
0 350 16 0 0
0 0 366 11 0 
0 376 8  0 0
0 0 380 28 0 
0 0 397 55 0
0 398 45 0 0  
0 400 19 0 0 
0 402 30 0 0")

是否可以通过参数选择班次数量?如果我要移动两,三或四列而不是一列。

1 个答案:

答案 0 :(得分:3)

这里有两种可能的解决方案,如果您愿意,可以将它们包装为一个函数。

第一种解决方案的原理是转置数据集并将行用作列,以便可以使用< element store={store}> <SubElement/> </element> (您随机选择的行)然后再次转置:

mutate_at

另一种方法,不进行转置,而是使用dt <- read.table(text = " 0 344 34 0 0 0 350 16 0 0 0 366 11 0 0 0 376 8 0 0 0 380 28 0 0 0 397 55 0 0 0 398 45 0 0 0 400 19 0 0 0 402 30 0 0") library(tidyverse) # for reproducibility set.seed(4) # pick number of rows to shift num_rows = round(1/3 * nrow(dt)) # sample position of those rows rows = sample(1:nrow(dt), num_rows) # specify number of shifts num_shifts = 2 t(dt) %>% # transpose dataset data.frame() %>% # update to data frame mutate_at(rows, ~lag(., num_shifts, default = 0L)) %>% # use the selected row positions and the selected number of shifts to apply this function t() %>% # transapose data again data.frame(., row.names = NULL) # update to dataframe # X1 X2 X3 X4 X5 # 1 0 0 0 344 34 # 2 0 350 16 0 0 # 3 0 0 0 366 11 # 4 0 376 8 0 0 # 5 0 380 28 0 0 # 6 0 0 0 397 55 # 7 0 398 45 0 0 # 8 0 400 19 0 0 # 9 0 402 30 0 0 处理行:

map2