遍历列和行并将值复制到 R 中的新列

Loop through columns and rows and copy values into new column in R

我对 R 还是很陌生,我正在尝试完成数据整理,但有点卡住了。

我将 R 中的数据组织成以下数据框格式(维度 [24,17]):

Id  a   b   c   d   e   f   g   h   i   j   k   k   m   n   o   p
1   999 2   2   999 999 999 999 2   2   2   2   2   2   999 999 999
2   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
3   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
4   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
5   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
6   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
7   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
8   NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
9   999 999 999 999 999 999 999 999 999 999 999 999 999 999 999 999
10  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
11  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
12  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
13  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
14  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
15  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
16  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
17  1   3   4   999 2   999 999 999 2   999 999 999 2   2   2   999
18  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
19  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
20  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
21  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
22  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
23  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
24  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA

我试图实现的是每第 8 行(从第 1 行开始,第 1、9、17 行等)在一列中填充值,其中 999 以外的值将复制到每个值下方其他在单列中。在该行仅包含 999 个值的情况下,我希望列中的 8 乘以 999 彼此下方。在这个有 24 行的特定示例中,该列将按以下维度 [1,24]:

填充(基于第 1、9、17 行)
2
2
2
2
2
2
2
2
999
999
999
999
999
999
999
999
1
3
4
2
2
2
2
2

这意味着我必须遍历每一列,从第 1 列第 1 行开始,直到第 1 行所有列的末尾,然后移动到第 9 行第 1 列,直到第 9 行所有列的末尾,等等. 我查看了 R 中使用条件将行转换为列的示例,但我无法完成工作。

鉴于我缺乏这方面的知识,有人知道用 R 完成这项工作的方法吗?

我们可以先使用seq提取相关行。

df1 <- df[seq(1, nrow(df), 8), ]

然后使用 apply 按行我们可以检查该行中的所有值是否都是 999 并相应地 return 输出。

c(apply(df1, 1, function(x) if(all(x == 999)) rep(999, 8) else x[x != 999][1:8]))
 #[1] 2 2 2 2 2 2 2 2 999 999 999 999 999 999 999 999  1 3 4 2 2 2 2 2

如果需要作为一列数据框,我们可以将 data.frame 环绕此输出。