我有6个副本,每组在每一天。正如您在下面的数据的子样本中所看到的那样,复制号(1-6)对于一些细胞来说是缺失的,但并不是所有的单元。对于Date集群中的每个组,我想用该集群缺少的复制值填充空单元格。例如,如果复制"3“是当前唯一标记的复制,我希望将该集群中剩余的5个单元标记为"1”、"2“、"4”、"5“和"6",添加的复制不按特定顺序排列。
我拥有的数据如下:
Date Group Value Replicate
8/8/2002 A 77.8 3
8/8/2002 A 0
8/8/2002 A 0
8/8/2002 A 0
8/8/2002 A 0
8/8/2002 A 0
6/28/2003 A 88.9 1
6/28/2003 A 66.7 3
6/28/2003 A 44.4 4
6/28/2003 A 88.9 6
6/28/2003 A 0
6/28/2003 A 144.4
6/28/2006 B 988.9 2
6/28/2006 B 0
6/28/2006 B 0
6/28/2006 B 0
6/28/2006 B 0
6/28/2006 B 0
8/5/2006 B 122.2 1
8/5/2006 B 11.1 2
8/5/2006 B 55.6 3
8/5/2006 B 55.6 4
8/5/2006 B 88.9 5
8/5/2006 B 177.8 6我想让数据看起来像这样
Date Group Value Replicate
8/8/2002 A 77.8 3
8/8/2002 A 0 1
8/8/2002 A 0 2
8/8/2002 A 0 4
8/8/2002 A 0 5
8/8/2002 A 0 6
6/28/2003 A 88.9 1
6/28/2003 A 66.7 3
6/28/2003 A 44.4 4
6/28/2003 A 88.9 6
6/28/2003 A 0 2
6/28/2003 A 144.4 5
6/28/2006 B 988.9 2
6/28/2006 B 0 3
6/28/2006 B 0 4
6/28/2006 B 0 5
6/28/2006 B 0 6
6/28/2006 B 0 1
8/5/2006 B 122.2 1
8/5/2006 B 11.1 2
8/5/2006 B 55.6 3
8/5/2006 B 55.6 4
8/5/2006 B 88.9 5
8/5/2006 B 177.8 6是否有一种有效的方法来使用R(我的数据集有大约20,000行)来填充这些缺失的复制值?
发布于 2015-04-15 16:06:53
您可以创建一个小的自定义函数来代替您,然后使用一些数据操作包(如dplyr )按日期组应用该函数。下面是一个例子:
library(dplyr)
f <- function(x) {
na_idx <- which(is.na(x))
unique_elements <- unique(x[-na_idx])
set_diff <- setdiff(1:6, unique_elements)
x[na_idx] <- set_diff
x
}
df %>%
group_by(Date) %>%
mutate(Replicate = f(Replicate)) # you could add %>% ungroup if required
#Source: local data frame [24 x 4]
#Groups: Date
#
# Date Group Value Replicate
#1 8/8/2002 A 77.8 3
#2 8/8/2002 A 0.0 1
#3 8/8/2002 A 0.0 2
#4 8/8/2002 A 0.0 4
#5 8/8/2002 A 0.0 5
#6 8/8/2002 A 0.0 6
#7 6/28/2003 A 88.9 1
#8 6/28/2003 A 66.7 3
#9 6/28/2003 A 44.4 4
#10 6/28/2003 A 88.9 6
#.. ... ... ... ...您可能可以用较少的行/键入来编写函数,但我发现每一行只需执行1次操作就更容易阅读和执行,因此我将保留它的原样。
注意:在读取数据时,我使用了fill = TRUE参数,因此空单元格("“条目)中填充了NA。如果需要将当前数据转换为该格式,则可以执行以下操作:
df[] <- lapply(df, function(x) {
if(is.character(x)) {
x[x == ""] <- NA; type.convert(x)
} else x
})这很有用,因为在带有"“项的示例数据中,应该是数字的列是字符,因此不能将它们用于数学操作。
发布于 2015-04-15 16:37:25
下面是另一种不使用dplyr或lapply的方法。
# http://stackoverflow.com/questions/9665984/how-to-delete-multiple-values-from-a-vector
# your.data is your data
dates <- unique(your.data$Date)
for(date in dates){
this.date <- your.data[ which(your.data$Date == date), ]
remove <- this.date$Replicate
full.rep <- 1:6
fill <- full.rep [! full.rep %in% remove]
fill <- sample(fill) # randomize fill
this.date[ which(!(this.date$Replicate %in% remove)), ]$Replicate <- fill
your.data[ which(your.data$Date == date), ] <- this.date
}发布于 2015-04-16 13:17:44
使用data.table
require(data.table)
setkey(dt, Date)[is.na(Replicate),
Replicate := setdiff(1:6, dt[.(thisDate), Replicate]),
by=.(thisDate=Date)]Replicate,得到NA是is.na(Replicate)的索引。dt的那些行中,Replicate是NA,我们按Date分组(我们将它重命名为另一个名称,以便在下一步的联接中使用它)。Replicate是NA的每一组行,在按thisDate分组时,我们首先通过执行一个基于连接的子集- dt[.(thisDate), Replicate]来提取所有Replicate值。然后setdiff(1:6, <all Replicate values>)只返回剩余的值。我们将它与Replicate和Replicate :=一起分配回希望这能有所帮助。
https://stackoverflow.com/questions/29654769
复制相似问题