R 重新扩展压缩数据帧以在缺少的行中包含零值

R 重新扩展压缩数据帧以在缺少的行中包含零值,r,R,给定以下形式的数据集: > Test Pos Watson Crick Total 1 39023 0 0 0 2 39024 0 0 0 3 39025 0 0 0 4 39026 2 1 3 5 39027 0 0 0 6 39028 0 4 4 7 39029 0 0 0 8

给定以下形式的数据集:

> Test
   Pos     Watson Crick Total
1  39023      0     0     0
2  39024      0     0     0
3  39025      0     0     0
4  39026      2     1     3
5  39027      0     0     0
6  39028      0     4     4
7  39029      0     0     0
8  39030      0     1     1
9  39031      0     0     0
10 39032      0     0     0
11 39033      0     0     0
12 39034      1     0     1
13 39035      0     0     0
14 39036      0     0     0
15 39037      3     0     3
16 39038      2     0     2
17 39039      0     0     0
18 39040      0     1     1
19 39041      0     0     0
20 39042      0     0     0
21 39043      0     0     0
22 39044      0     0     0
23 39045      0     0     0
我可以使用以下代码压缩这些数据以删除零行:

a=subset(Test, Total!=0)

> a
    Pos     Watson Crick Total
 4  39026      2     1     3
 6  39028      0     4     4
 8  39030      0     1     1
 12 39034      1     0     1
 15 39037      3     0     3
 16 39038      2     0     2
 18 39040      0     1     1
我将如何编写反向转换代码?i、 e.将数据帧
a
转换回
Test
的原始形式

更具体地说:如果没有对原始数据的任何访问,如何为任意范围的Pos重新扩展数据(包括所有连续的“Pos”行)


这里,
ID
列是不相关的。在一个真实的例子中,
ID
数字只是由R创建的行号。在一个真实的例子中,压缩的数据集将有顺序的
ID
数字。

您至少需要知道要填写的
Pos
值。然后,它是
dplyr
中的
join
mutate
操作的组合

Test <- read.table(text = "
   Pos     Watson Crick Total
1  39023      0     0     0
2  39024      0     0     0
3  39025      0     0     0
4  39026      2     1     3
5  39027      0     0     0
6  39028      0     4     4
7  39029      0     0     0
8  39030      0     1     1
9  39031      0     0     0
10 39032      0     0     0
11 39033      0     0     0
12 39034      1     0     1
13 39035      0     0     0
14 39036      0     0     0
15 39037      3     0     3
16 39038      2     0     2
17 39039      0     0     0
18 39040      0     1     1
19 39041      0     0     0
20 39042      0     0     0
21 39043      0     0     0
22 39044      0     0     0")

library(dplyr)

Nonzero <- Test %>% filter(Total > 0)

All_Pos <- Test %>% select(Pos)

Reconstruct <-
  All_Pos %>%
  left_join(Nonzero) %>%
  mutate_each(funs(ifelse(is.na(.), 0, .)), Watson, Crick, Total)

您至少需要知道要填写的
Pos
值。然后,它是
dplyr
中的
join
mutate
操作的组合

Test <- read.table(text = "
   Pos     Watson Crick Total
1  39023      0     0     0
2  39024      0     0     0
3  39025      0     0     0
4  39026      2     1     3
5  39027      0     0     0
6  39028      0     4     4
7  39029      0     0     0
8  39030      0     1     1
9  39031      0     0     0
10 39032      0     0     0
11 39033      0     0     0
12 39034      1     0     1
13 39035      0     0     0
14 39036      0     0     0
15 39037      3     0     3
16 39038      2     0     2
17 39039      0     0     0
18 39040      0     1     1
19 39041      0     0     0
20 39042      0     0     0
21 39043      0     0     0
22 39044      0     0     0")

library(dplyr)

Nonzero <- Test %>% filter(Total > 0)

All_Pos <- Test %>% select(Pos)

Reconstruct <-
  All_Pos %>%
  left_join(Nonzero) %>%
  mutate_each(funs(ifelse(is.na(.), 0, .)), Watson, Crick, Total)

这里还有另一种可能性,使用base
R
。除非明确提供
Pos
的初始值和最终值,否则还原数据帧中的第一个和最后一个索引值将与“压缩”数据帧
a
中给出的值相对应:

restored <- data.frame(Pos=(a$Pos[1]:a$Pos[nrow(a)])) # change range if required
restored <- merge(restored,a, all=TRUE)
restored[is.na(restored)] <- 0
#> restored
#     Pos Watson Crick Total
#1  39026      2     1     3
#2  39027      0     0     0
#3  39028      0     4     4
#4  39029      0     0     0
#5  39030      0     1     1
#6  39031      0     0     0
#7  39032      0     0     0
#8  39033      0     0     0
#9  39034      1     0     1
#10 39035      0     0     0
#11 39036      0     0     0
#12 39037      3     0     3
#13 39038      2     0     2
#14 39039      0     0     0
#15 39040      0     1     1

restored这里有另一种可能性,使用base
R
。除非明确提供
Pos
的初始值和最终值,否则还原数据帧中的第一个和最后一个索引值将与“压缩”数据帧
a
中给出的值相对应:

restored <- data.frame(Pos=(a$Pos[1]:a$Pos[nrow(a)])) # change range if required
restored <- merge(restored,a, all=TRUE)
restored[is.na(restored)] <- 0
#> restored
#     Pos Watson Crick Total
#1  39026      2     1     3
#2  39027      0     0     0
#3  39028      0     4     4
#4  39029      0     0     0
#5  39030      0     1     1
#6  39031      0     0     0
#7  39032      0     0     0
#8  39033      0     0     0
#9  39034      1     0     1
#10 39035      0     0     0
#11 39036      0     0     0
#12 39037      3     0     3
#13 39038      2     0     2
#14 39039      0     0     0
#15 39040      0     1     1


在这种情况下恢复还是在一般情况下恢复?两者都恢复?我是来学习的。你的身份证号码是唯一的吗?如果你的data.frame已经被“压缩”,并且你不知道原始号码,我认为这个问题的答案对你的真实情况没有帮助。@Pascal。压缩表单中唯一缺少的是连续的“Pos”行。这些只需要在Watson、Crick和Total中重新填充零就可以重建原始结构。在这种情况下还是一般情况下?两者都是?我是来学习的。你的身份证号码是唯一的吗?如果你的data.frame已经被“压缩”,并且你不知道原始号码,我认为这个问题的答案对你的真实情况没有帮助。@Pascal。压缩表单中唯一缺少的是连续的“Pos”行。只需在Watson、Crick和Total中重新填充零即可重建原始结构。谢谢。但我认为我试图提供数据的快照,从而混淆了这个问题。实际数据将从Pos值0开始,并扩展到示例之外。压缩数据将是整个数据集的压缩。然后,我想在两个任意行位置之间重新展开数据。应该没有必要(据我所知)将删除的行存储在一个单独的向量中。不,如果没有快照,它将很难提供帮助。如果您知道
Pos
的最大值,就可以轻松构建
All\u Pos,首先处理压缩数据可能会快得多;如果可能的话,这取决于您的应用程序。澄清:一旦压缩,将无法访问原始数据。你是说我可以从压缩表单中获取所有位置吗?我的应用是对数据应用平滑函数。就我所能编写的代码而言,这需要我重新展开要平滑的感兴趣区域的零容器行。您所需要的就是
MaxPos
。你用的是什么平滑函数?谢谢但我认为我试图提供数据的快照,从而混淆了这个问题。实际数据将从Pos值0开始,并扩展到示例之外。压缩数据将是整个数据集的压缩。然后,我想在两个任意行位置之间重新展开数据。应该没有必要(据我所知)将删除的行存储在一个单独的向量中。不,如果没有快照,它将很难提供帮助。如果您知道
Pos
的最大值,就可以轻松构建
All\u Pos,首先处理压缩数据可能会快得多;如果可能的话,这取决于您的应用程序。澄清:一旦压缩,将无法访问原始数据。你是说我可以从压缩表单中获取所有位置吗?我的应用是对数据应用平滑函数。就我所能编写的代码而言,这需要我重新展开要平滑的感兴趣区域的零容器行。您所需要的就是
MaxPos
。你用的是什么平滑函数?xlim=39020 range=30已恢复@Matt很高兴我能帮忙。我喜欢你扩大范围的解决方案。我的感谢评论似乎已被删除。非常感谢。xlim=39020 range=30已恢复@Matt很高兴我能帮忙。我喜欢你扩大范围的解决方案。我的感谢评论似乎已被删除。非常感谢。