遍历列和行并将值复制到 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
环绕此输出。
我对 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
环绕此输出。