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这里有另一种可能性,使用baseR
。除非明确提供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很高兴我能帮忙。我喜欢你扩大范围的解决方案。我的感谢评论似乎已被删除。非常感谢。