【问题标题】:Removing repeated rows (by several columns) and recalculating count and frequency values in R删除重复的行(通过几列)并重新计算 R 中的计数和频率值
【发布时间】:2020-08-12 12:02:11
【问题描述】:

我有一个大数据,我正在尝试根据几列删除重复的行条目。列标题和示例条目是

 count  freq,   cdr3nt,       cdr3aa,    v,      d,    j,     VEnd, DStart, DEnd, JStart
 5036   0.0599  TGCAGTGCTAGAG CSARDPDR TRBV20-1 TRBD1 TRBJ1-5  15     17     43    21

有几千行,两行要匹配除“count”和“freq”之外的所有值必须相同。我想删除重复的条目,但在此之前,我需要将一个重复行的“计数”值更改为单个重复行“计数”的总和,以反映真实的丰度。然后,我需要根据整个表的所有计数之和,重新计算新“计数”的频率。

由于某种原因,脚本没有改变任何东西,而且我知道表中有重复的条目。

这是我的脚本。

library(dplyr)

# Input sample replicate table.
  dta <- read.table("/data/Sample/ci1371.txt", header=TRUE, sep="\t")

# combine rows with identical data.  Recalculation of frequency values.
 dta %>% mutate(total = sum(count)) %>%
    group_by(cdr3nt, cdr3aa, v, d, j, VEnd, DStart, DEnd, JStart) %>%
    summarize(count_new = sum(count), freq = count_new/mean(total))

 dta_clean <- dta

非常感谢任何帮助。这是数据表外观的屏幕截图。

【问题讨论】:

  • 样本数据会很有用,还是您希望我们生成完全随机的数据(可能不具有代表性)?
  • 在无法访问时包含数据的 read.table() 是没有帮助的。而是提供一些示例数据,例如使用 dput(),其中包含一些重复项,因此我们可以重现问题
  • 附上数据集的缩减副本对我来说可能更容易。有没有办法在这个板上做到这一点?
  • 正如@mnist 所建议的,首选方法是我们可以轻松使用的明确格式,即dput。不过,除此之外,最好提供数据的代表性样本,这样我们就不需要滚动浏览数据页面,并且您可以获得一种处理真实数据的方法(更大的)数据。 (或者你可以调整我下面的播放数据以适应你的数据集。)
  • 嗯,没有。即使我可以确定您如何将数据电子表格读入 R,我不会从图像转录 (xkcd.com/2116)。有关提供代表性样本数据的其他建议,请参阅这些链接:stackoverflow.com/q/5963269minimal reproducible examplestackoverflow.com/tags/r/info

标签: r dataframe


【解决方案1】:

初步步骤:转换在data.table和存储列名称上不是countfreq

library(data.table)
setDT(df)
cols <- colnames(df)[3:ncol(df)]

(在您的示例中,countfreq在前两个位置)

重新计算计数和频率:

df_agg <- df[, .(count = sum(count)), by = cols]
df_agg[, 'freq' := count/sum(count)]

如果要通过除countfreq

之外,请通过所有列保持唯一值
df_unique <- unique(df, by = cols)

【讨论】:

  • Linog,df_agg 的产品似乎可以解决问题。但是,新的 count 和 freq 列位于数据表的顶部,将其附加到表的开头(左侧)的最佳方法是什么?
  • 您可以使用setcolorder 重新排列列。在您的情况下,setcolorder(df_agg, c('freq','count')可能会做这个技巧。在提到的那些 span>之后报告其他栏
  • 我会给它一个镜头 span>
【解决方案2】:

示例数据,其中grp1grp2 旨在作为您的所有分组变量。

set.seed(42)
dat <- data.frame(
  grp1 = sample(1:2, size=20, replace=TRUE),
  grp2 = sample(3:4, size=20, replace=TRUE),
  count = sample(100, size=20, replace=TRUE),
  freq = runif(20)
)
head(dat)
#   grp1 grp2 count      freq
# 1    2    4    38 0.6756073
# 2    2    3    44 0.9828172
# 3    1    4     4 0.7595443
# 4    2    4    98 0.5664884
# 5    2    3    44 0.8496897
# 6    2    4    96 0.1894739

代码:

library(dplyr)
dat %>%
  group_by(grp1, grp2) %>%
  summarize(count = sum(count)) %>%
  ungroup() %>%
  mutate(freq = count / sum(count))
# # A tibble: 4 x 4
#    grp1  grp2 count   freq
#   <int> <int> <int>  <dbl>
# 1     1     3    22 0.0206
# 2     1     4   208 0.195 
# 3     2     3   383 0.358 
# 4     2     4   456 0.427 

【讨论】:

  • 因为我一直在使用dplyr,我会尝试这个代码 span>
  • 出于某种原因,重复仍然显示出来。生成的表与初始表相同。似乎代码没有读取我的表。 span>
  • 我发现它非常不太可能使用所有9列(该数据)将为您提供任何多行组。只有您可以区分什么标识了一个 group 和什么标识了该组中的数据。例如,我认为cdr3ntcdr3aa不是 i>组标识符,我也猜到了你的最后四列。所以也许只是group_by(v:j)? span>
  • 我会探索这个。 span>
猜你喜欢
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
相关资源
最近更新 更多