从R

时间:2015-06-25 14:23:18

标签: r

我目前正在使用 R 将实验数据转换为高质量数据集。我的代码的一个功能是检测实验的重复并相应地标记它们。我为此编写了以下代码: -

DAYREP<-function(a){
  CAPS<-c("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P",
          "Q","R","S","T","U","V","W","X","Y","Z")
  if (unique(table(a))==1 && length(unique(table(a)))==1){
    return(a)
  }
  else{
    for (i in a){
      if (table(a)[[i]]>=2){
        CAPS.sum<-CAPS[1:as.vector(table(a)[[i]])-1]
        val<-c(i,paste0(i,CAPS.sum))
        del<-a[!a %in% i]
        vec<-append(del,val,after=i-1)
        return(vec)
      }
    }
  }
}

我使用了以下日期数字矢量进行测试,并突出显示了目前已知的每种可能结果。

a<-c(1,2,3,4,5,6,7,8,9)
b<-c(1,2,3,4,5,6,7,8,8)
c<-c(1,2,3,3,4,5,6)
d<-c(1,1,1,1,1,1)
e<-c(1,2,2,3,4,5,6,6,7)
f<-c(2,7,8,10,11,11,14)

它产生以下输出: -

> DAYREP(a)
[1] 1 2 3 4 5 6 7 8 9
> DAYREP(b)
[1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "8A"
> DAYREP(c)
[1] "1"  "2"  "3"  "3A" "4"  "5"  "6" 
> DAYREP(d)
[1] "1"  "1A" "1B" "1C" "1D" "1E"
> DAYREP(e)
[1] "1"  "2"  "2A" "3"  "4"  "5"  "6"  "6"  "7" 
> DAYREP(f)
Error in table(a)[[i]] : subscript out of bounds

该功能适用​​于所有测试,但e和f。使用e它只转换第一组重复值,并且用f返回错误信息。

我知道问题是由table(a)[[i]]元素调用表中的频率值引起的,但是我不确定是否有一种方法来调用从表中列出的值。 E.g。

> table(e)
e
1 2 3 4 5 6 7 
1 2 1 1 1 2 1

我正在使用的方法是调用底线,但我希望调用顶线。有人知道解决方案吗?

2 个答案:

答案 0 :(得分:0)

@ cr1msonB1ade善意地建议使用make.unique函数,该函数能够执行上述函数所做的操作,并略有不同。

> make.unique(e)
[1] "1"   "2"   "2.1" "3"   "4"   "5"   "6"   "6.1" "7"

谢谢!

答案 1 :(得分:0)

正如我在评论中所述,我认为你想要的是内置函数make.unique,但是你也有一些关于如何使用表格的问题,所以我也想解决这些问题。当您想通过变量名称({for循环中的table)访问i中的值时,您希望使用单括号[进行索引而不是双括号{{1 }}。另一个问题是该表将值转换为因子,因此您必须使用[[进行索引。我不认为这完全修复了你的脚本,但它可能让你足够接近。