首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >填充R中缺少的复制值

填充R中缺少的复制值
EN

Stack Overflow用户
提问于 2015-04-15 15:44:15
回答 3查看 625关注 0票数 2

我有6个副本,每组在每一天。正如您在下面的数据的子样本中所看到的那样,复制号(1-6)对于一些细胞来说是缺失的,但并不是所有的单元。对于Date集群中的每个组,我想用该集群缺少的复制值填充空单元格。例如,如果复制"3“是当前唯一标记的复制,我希望将该集群中剩余的5个单元标记为"1”、"2“、"4”、"5“和"6",添加的复制不按特定顺序排列。

我拥有的数据如下:

代码语言:javascript
复制
   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

我想让数据看起来像这样

代码语言:javascript
复制
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行)来填充这些缺失的复制值?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-15 16:06:53

您可以创建一个小的自定义函数来代替您,然后使用一些数据操作包(如dplyr )按日期组应用该函数。下面是一个例子:

代码语言:javascript
复制
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。如果需要将当前数据转换为该格式,则可以执行以下操作:

代码语言:javascript
复制
df[] <- lapply(df, function(x) {
  if(is.character(x)) {
    x[x == ""] <- NA; type.convert(x)
  } else x
  })

这很有用,因为在带有"“项的示例数据中,应该是数字的列是字符,因此不能将它们用于数学操作。

票数 4
EN

Stack Overflow用户

发布于 2015-04-15 16:37:25

下面是另一种不使用dplyr或lapply的方法。

代码语言:javascript
复制
# 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
}
票数 0
EN

Stack Overflow用户

发布于 2015-04-16 13:17:44

使用data.table

代码语言:javascript
复制
require(data.table)
setkey(dt, Date)[is.na(Replicate), 
        Replicate := setdiff(1:6, dt[.(thisDate), Replicate]), 
        by=.(thisDate=Date)]
  • 首先,通过做Replicate,得到NAis.na(Replicate)的索引。
  • dt的那些行中,ReplicateNA,我们按Date分组(我们将它重命名为另一个名称,以便在下一步的联接中使用它)。
  • 因此,对于ReplicateNA的每一组行,在按thisDate分组时,我们首先通过执行一个基于连接的子集- dt[.(thisDate), Replicate]来提取所有Replicate值。然后setdiff(1:6, <all Replicate values>)只返回剩余的值。我们将它与ReplicateReplicate :=一起分配回

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29654769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档