【问题标题】:Loop through columns and rows and copy values into new column in R循环遍历列和行并将值复制到 R 中的新列中
【发布时间】:2020-05-13 08:34:44
【问题描述】:

我对 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、9、17 行),如下所示,尺寸为 [1,24]:

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 中完成这项工作的方法吗?

【问题讨论】:

    标签: r dataframe conditional-statements transpose


    【解决方案1】:

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

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

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

    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 包装在此输出周围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 2013-04-21
      • 1970-01-01
      • 2010-12-09
      相关资源
      最近更新 更多