在R之间没有for循环的行之间移动值

Pat*_*gon 7 performance for-loop r dataframe

我编写了一些用于组织以不同频率采样的数据的代码,但是我广泛使用了for循环,当数据集很大时,这会大大降低代码的操作速度.我一直在浏览我的代码,找到删除for循环以加快速度的方法,但其中一个循环让我感到难过.

举个例子,假设数据是以3Hz采样的,所以每秒数据都会得到三行.但是,变量A,B和C各自以1Hz采样,因此每三行我将获得一个值.在一秒周期内连续采样变量,导致数据的对角性质.

更复杂的是,有时在原始数据集中会丢失一行.

我的目标是:确定了我希望保留的行后,我想将后续行中的非NA值移动到守护者行中.如果它不是丢失的数据问题,我将始终保持行包含第一个变量的值,但如果其中一行丢失,我将保留下一行.

在下面的示例中,第六个样本和第十个样本丢失.

A <- c(1, NA, NA, 4, NA, 7, NA, NA, NA, NA)
B <- c(NA, 2, NA, NA, 5, NA, 8, NA, 11, NA)
C <- c(NA, NA, 3, NA, NA, NA, NA, 9, NA, 12)

test_df <- data.frame(A = A, B = B, C = C)

test_df
     A  B  C
 1   1 NA NA
 2  NA  2 NA
 3  NA NA  3
 4   4 NA NA
 5  NA  5 NA
 6   7 NA NA
 7  NA  8 NA
 8  NA NA  9
 9  NA 11 NA
10  NA NA 12

keep_rows <- c(1, 4, 6, 9)
Run Code Online (Sandbox Code Playgroud)

将值移动到守护者行后,我将删除临时行,从而产生以下结果:

test_df <- test_df[keep_rows, ]
test_df
     A  B  C
 1   1  2  3
 2   4  5 NA
 3   7  8  9
 4  NA 11 12
Run Code Online (Sandbox Code Playgroud)

最后,我只希望每秒数据有一行,而NA值只应保留原始数据行丢失的位置.

有没有人有任何关于如何在不使用for循环的情况下移动数据的想法?我很感激任何帮助!对不起,如果这个问题太罗嗦了; 我想在太多信息方面犯错,而不是不够.

Joh*_*lby 5

这应该这样做:

test_df = with(test_df, cbind(A[1:(length(A)-2)], B[2:(length(B)-1)], C[3:length(C)]))
test_df = data.frame(test_df[!apply(test_df, 1, function(x) all(is.na(x))), ])
colnames(test_df) = c('A', 'B', 'C')
Run Code Online (Sandbox Code Playgroud)
> test_df
   A  B  C
1  1  2  3
2  4  5 NA
3  7  8  9
4 NA 11 12
Run Code Online (Sandbox Code Playgroud)

如果你想要更快的东西:

test_df = data.frame(test_df[rowSums(is.na(test_df)) != ncol(test_df), ])
Run Code Online (Sandbox Code Playgroud)