R 基于重复行的子集数据表

R 基于重复行的子集数据表,r,data.table,row,subset,R,Data.table,Row,Subset,我有一个存储在对象ddf中的数据表列表(示例如下所示): 我想对列表ddf进行子集划分,以便结果只包含以下ddf: 每行至少有9行 这9行中的每一行都是相同的 我想存储这个子设置的输出 我已经为此编写了以下代码: for(i in 1:100){ m=(as.numeric(nrow(df[[i]]))>= 9) if(m == TRUE & df[[i]][1,] = df[[i]][2,] = =df[[i]][3,] =df[[i]][4,] =df[[i]][5,

我有一个存储在对象
ddf
中的数据表列表(示例如下所示):

我想对列表
ddf
进行子集划分,以便结果只包含以下ddf:

  • 每行至少有9行
  • 这9行中的每一行都是相同的
  • 我想存储这个子设置的输出
  • 我已经为此编写了以下代码:

     for(i in 1:100){
     m=(as.numeric(nrow(df[[i]]))>= 9)
     if(m == TRUE & df[[i]][1,] = df[[i]][2,] = 
     =df[[i]][3,] =df[[i]][4,] =df[[i]][5,] =df[[i]][6,]=
     df[[i]][7,]=df[[i]][8,]=df[[i]][9,]){
     print(df[[i]])
     }}
    
    请告诉我出了什么问题&我如何根据“n”个类似行概括子设置的结果

    [跟进问题]

        Answer obtained from Main question:
        > ddf[sapply(ddf, function(x) nrow(x) >= n & nrow(unique(x)) == 1)]
          $`61`
             V1 V2 V3
          1:  a  c  b
          2:  a  c  b
          3:  a  c  b
          4:  a  c  b
          5:  a  c  b
          6:  a  c  b
          7:  a  c  b
    
          $`68`
             V1 V2 V3
          1:  a  c  a
          2:  a  c  a
          3:  a  c  a
          4:  a  c  a
          5:  a  c  a
          6:  a  c  a
          7:  a  c  a
          8:  a  c  a
    
          $`91`
             V1 V2 V3
          1:  b  c  a
          2:  b  c  a
          3:  b  c  a
          4:  b  c  a
          5:  b  c  a
          6:  b  c  a
          7:  b  c  a
    
                   ..... till the last data.frame which meet the row matching criteria (of at least 9 similar rows)
    
          There are only 2 types of elements in the list: 
                      **[[.. ]]**        
         **Case 1.** >70% accuracy       
         **Case 2.** <70% accuracy       
    
    主要问题的答案:
    >ddf[sapply(ddf,函数(x)nrow(x)>=n&nrow(唯一(x))=1]
    $`61`
    V1 V2 V3
    1:a、c、b
    2:a、c、b
    3:a、c、b
    4:a、c、b
    5:a、c、b
    6:a、c、b
    7:a、c、b
    $`68`
    V1 V2 V3
    1:a-c-a
    2:a-c-a
    3:a-c-a
    4:a-c-a
    5:a-c-a
    6:a-c-a
    7:a-c-a
    8:a-c-a
    $`91`
    V1 V2 V3
    1:bca
    2:b-c-a
    3:b-c-a
    4:b-c-a
    5:bca
    6:bca
    7:b-c-a
    ..... 直到满足行匹配标准的最后一个data.frame(至少9个类似行)
    列表中只有两种类型的元素:
    **[[.. ]]**        
    **案例1.*>70%的准确度
    
    **案例2.*我们可以在
    列表中循环('ddf'),只将
    重复的
    行与(
    重复的
    )子集,
    对数据集进行排序,
    如果数据集'x1'的行数大于8,则得到前9行(
    头(x1,9)
    )或
    else
    返回打印的“坏结果”

    lapply(ddf, function(x) {
      x1 <- x[duplicated(x)|duplicated(x, fromLast=TRUE)]
    if(nrow(x1)>9) {
     x1[order(V1, V2, V3), head(.SD, 9)] 
    
      } else "bad answer"
     })
    #[[1]]
    #   V1 V2 V3
    #1:  b  c  a
    #2:  b  c  a
    #3:  b  c  a
    #4:  b  c  a
    #5:  b  c  a
    #6:  b  c  a
    #7:  b  c  a
    #8:  b  c  a
    #9:  b  c  a
    
    #[[2]]
    #[1] "bad answer"
    
    #[[3]]
    #[1] "bad answer"
    
    lappy(ddf,函数(x){
    x1(9){
    x1[顺序(V1,V2,V3),头部(.SD,9)]
    }否则就是“坏答案”
    })
    #[[1]]
    #V1 V2 V3
    #1:bca
    #2:b-c-a
    #3:b-c-a
    #4:b-c-a
    #5:bca
    #6:bca
    #7:b-c-a
    #8:bca
    #9:bca
    #[[2]]
    #[1] “回答不好”
    #[[3]]
    #[1] “回答不好”
    
    数据
    ddf我们可以在
    列表中循环('ddf'),只将
    duplicate
    行与(
    duplicated
    )一起子集,
    对数据集进行排序,
    如果数据集'x1'的行数大于8,则得到前9行(
    头(x1,9)
    )或
    else
    返回打印的“坏结果”

    lapply(ddf, function(x) {
      x1 <- x[duplicated(x)|duplicated(x, fromLast=TRUE)]
    if(nrow(x1)>9) {
     x1[order(V1, V2, V3), head(.SD, 9)] 
    
      } else "bad answer"
     })
    #[[1]]
    #   V1 V2 V3
    #1:  b  c  a
    #2:  b  c  a
    #3:  b  c  a
    #4:  b  c  a
    #5:  b  c  a
    #6:  b  c  a
    #7:  b  c  a
    #8:  b  c  a
    #9:  b  c  a
    
    #[[2]]
    #[1] "bad answer"
    
    #[[3]]
    #[1] "bad answer"
    
    lappy(ddf,函数(x){
    x1(9){
    x1[顺序(V1,V2,V3),头部(.SD,9)]
    }否则就是“坏答案”
    })
    #[[1]]
    #V1 V2 V3
    #1:bca
    #2:b-c-a
    #3:b-c-a
    #4:b-c-a
    #5:bca
    #6:bca
    #7:b-c-a
    #8:bca
    #9:bca
    #[[2]]
    #[1] “回答不好”
    #[[3]]
    #[1] “回答不好”
    
    数据
    ddf当
    ddf
    是您的数据表列表时,则:

    ddf[sapply(ddf, nrow) >= 9 & sapply(ddf, function(x) nrow(unique(x))) == 1]
    
    应该会给你想要的结果

    其中:

    • sapply(ddf,nrow)>=9
      检查数据表是否有九行或更多行
    • sapply(ddf,函数(x)nrow(unique(x))==1
      检查所有行是否相同
    或者使用@docendodiscimus建议的一个
    sapply
    调用:

    ddf[sapply(ddf, function(x) nrow(x) >= 9 & nrow(unique(x)) == 1)]
    
    或者使用
    .N
    特殊符号和
    数据的
    uniqueN
    功能。表

    ddf[sapply(ddf, function(x) x[,.N] >= 9 & uniqueN(x) == 1)]
    
    另一种选择是使用
    过滤器
    (根据@Frank在评论中的建议):


    获取数据表编号的两种方法:

    1.使用
    哪个

    which(sapply(ddf, function(x) nrow(x) >= 9 & nrow(unique(x)) == 1))
    
    2.为列表中的数据表指定名称:

    names(ddf) <- paste0('dt', 1:length(ddf))
    

    ddf
    是您的数据表列表时,则:

    ddf[sapply(ddf, nrow) >= 9 & sapply(ddf, function(x) nrow(unique(x))) == 1]
    
    应该会给你想要的结果

    其中:

    • sapply(ddf,nrow)>=9
      检查数据表是否有九行或更多行
    • sapply(ddf,函数(x)nrow(unique(x))==1
      检查所有行是否相同
    或者使用@docendodiscimus建议的一个
    sapply
    调用:

    ddf[sapply(ddf, function(x) nrow(x) >= 9 & nrow(unique(x)) == 1)]
    
    或者使用
    .N
    特殊符号和
    数据的
    uniqueN
    功能。表

    ddf[sapply(ddf, function(x) x[,.N] >= 9 & uniqueN(x) == 1)]
    
    另一种选择是使用
    过滤器
    (根据@Frank在评论中的建议):


    获取数据表编号的两种方法:

    1.使用
    哪个

    which(sapply(ddf, function(x) nrow(x) >= 9 & nrow(unique(x)) == 1))
    
    2.为列表中的数据表指定名称:

    names(ddf) <- paste0('dt', 1:length(ddf))
    


    请阅读有关如何完成任务的信息。现在更好了吗?理想情况下,我们可以将您的所有代码复制/粘贴到R中并开始修补。您提供的数据并不完全适合导入。请参阅Jaap提供的关于如何轻松共享(模拟)数据的链接。请阅读关于如何给出一个完整答案的信息。现在更好了吗?理想情况下,我们可以将您的所有代码复制/粘贴到R中并开始修补。您提供的数据并不完全适合导入。请参阅Jaap提供的关于如何轻松共享(模拟)数据的链接。我得到一个函数错误:第二个参数必须是listfunction(what,args,quote=FALSE,envir=parent.frame()){if(!is.list(args))stop(“第二个参数必须是列表”)if(quote)args@Rishi纠正了错误problem@arun我得到的子集的答案不正确,我得到的是一个data.table outputs,而我应该得到两个yes@akrun谢谢我得到一个函数错误:第二个参数必须是listfunction(what,args,quote=FALSE,envir=parent.frame()){if(!is.list(args))stop(“第二个参数必须是列表”)如果(引用)args@Rishi纠正了错误problem@arun我得到的子集答案不正确,我得到的是一个数据表输出,而我应该得到两个是@akrun谢谢你不能同时签入一个
    sapply
    call?@Jaap-我需要数据表编号显示在输出中..例如lst[[11]…,lst[[15]],假设他们符合subsetting@Jaap-我需要一个列表输出::对于不准确的结果,我得到“<70%的准确度”。对于正确的输出,我得到datatable