【问题标题】:Iterative grep with r用 r 迭代 grep
【发布时间】:2013-07-17 19:02:10
【问题描述】:

好的,谢谢你,我会重新开始这个问题:

这是我的 df

df = read.table(text = '    replicate    size   fh
ms03a_T0_r1  397.51 1099
ms03a_T0_r1  695.46    8
ms03a_T0_r1  708.76 1409
ms03a_T0_r1 1203.98  102
ms03a_T0_r2  397.52  749
ms03a_T0_r2  493.97   23
ms03a_T0_r2  538.43   12
ms03a_T0_r3  397.49  638
ms03a_T0_r3  399.84    9
ms03a_T0_r3  404.95   33
ms03a_T0_r3  406.85   40 ', header = T)

Rn <- as.numeric(length(levels(ol$replicate)))
# just to calculate the number of samples

据此,我希望拥有 3 个新数据集,每个数据集将仅包含具有“复制”变量的 *_r1 值的行、具有 *_r2 的行和具有 *_r3 的行。

我想用这些命令做到这一点:

for (i in 1:Rn){

  x <- df[as.character(sub('.*_r', '', as.character(replicate))) %in% i];

  outfile <- paste("rep_",i,"_edited.txt",sep="")
  write.table(x,quote=FALSE,sep=", ",outfile)
}

但我能够获得 .txt 输出,而不是 r 中的 df 对象。这样,我将不得不在 r 中再次导入它们以继续我的“脚本”的下一步,我不知道如何设置 r 以自动导入它们

【问题讨论】:

  • [i]_subsetted 不是有效的 R 名称。那应该是什么? otus_list 是什么? replicate 是什么?您的预期输出是什么?
  • [i]_subsetted 应该是子集行的输出 df。抱歉,otus_list 只是主数据框的名称。我想要(对于目前的主要 df)3 个新的 df:一个带有 *_r1 行,一个带有 *_r2 行,一个带有 *_r3 行
  • 在这种情况下,eddi 使用split 的最终建议可能就是您想要的。但是请务必阅读?make.names,这样您至少可以知道 R 中的有效变量名是什么。

标签: r loops subset


【解决方案1】:

我猜你想要这个:

df = read.table(text = '    replicate    size   fh
  ms03a_T0_r1  397.51 1099
  ms03a_T0_r1  695.46    8
  ms03a_T0_r1  708.76 1409
  ms03a_T0_r1 1203.98  102
  ms03a_T0_r2  397.52  749
  ms03a_T0_r2  493.97   23
  ms03a_T0_r2  538.43   12
  ms03a_T0_r3  397.49  638
  ms03a_T0_r3  399.84    9
 ms03a_T0_r3  404.95   33
 ms03a_T0_r3  406.85   40 ', header = T)

library(data.table)
dt = data.table(df)

special.ids = c(1,3)
dt[as.numeric(sub('.*_r', '', as.character(replicate))) %in% special.ids]
#     replicate    size   fh
#1: ms03a_T0_r1  397.51 1099
#2: ms03a_T0_r1  695.46    8
#3: ms03a_T0_r1  708.76 1409
#4: ms03a_T0_r1 1203.98  102
#5: ms03a_T0_r3  397.49  638
#6: ms03a_T0_r3  399.84    9
#7: ms03a_T0_r3  404.95   33
#8: ms03a_T0_r3  406.85   40

注意,as.character 是必需的,因为read.table 默认将字符串转换为因子。如果实际数据已经是字符串,则可能不需要它。

在二读时,也许你想要这个?

split(df, sub('.*_r', '', as.character(df$replicate)))

OP - 你需要解决你的问题。

【讨论】:

  • 现在我得到这个错误.. > for (i in 1:Rn){ + ol[as.numeric(sub('.*_r', '', as.character(replicate)) ) %in% input_name[i]]->a[i] + } 有 12 个警告(使用 warnings() 查看它们)> warnings() Messaggi di avvertimento: 1: In [&lt;-.data.table(*tmp*, i , value = structure(list( ... : 提供 60 个项目分配给列“复制”的 1 个项目(59 个未使用)..
  • @LucaZoccarato 尝试在问题中发布代码和错误,几乎不可能阅读评论;此外,如果您使您的问题独立且可重复,您通常会得到更好的答案(例如,现在我仍然不确定您到底想要实现什么;并且不要忘记@joran 的观点,即[i]_subsetted 不是一个有效的 R 名称)
猜你喜欢
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多