[R] :根据列值有条件地从Excel工作表中删除整行

2024-06-08 22:58:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个excel文件包含两张表。 第1张是

    Col.1  Col.2  Col.3 Col.4 Col.5 Col.6 Col.7 Col.8
1      1     2     3     4     5     6     7     8
2      6     7     8     9    10    11    12    13
3     11    12    13    14    15    16    17    18
4     16    17    18    19    20    21    22    23
5     21    22    23    24    25    26    27    28
6     26    27    28    29    30    31    32    33
7     31    32    33    34    35    36    37    38
8     36    37    38    39    40    41    42    43
9     41    42    43    44    45    46    47    48
10    46    47    48    49    50    51    52    53

表2包含

starInterval      endInterval
1                   10
51                  70
21                  30

现在我想从表2中选择第一行,并在表1的第8列中搜索是否在1到10之间找到值,删除整行,然后在表2中选择2行并继续。你知道吗

我在R中写的代码是

File1 = loadWorkbook("exp.xlsx")  # read file
IntervalSheet = readWorksheet(File1, sheet =  2) #read sheet 2
File1.Rows = nrow(IntervalSheet)




StartInterval = IntervalSheet[,1]
EndInterval = IntervalSheet[,2]


#read sheet 1 in which we have to delete the rows 
MalwareSheet = readWorksheet(File1, sheet =  1)
Malware.Sheet.Rows = nrow(MalwareSheet)




for (i in 1:File1.Rows )
    {
        # value selection from interval sheet
        startvalue = StartInterval[i]
        endvalue = EndInterval[i]

        for (j in 1:Malware.Sheet.Rows)
            {

                 d<-MalwareSheet[!(MalwareSheet$col.8 >= startvalue & MalwareSheet$col.8 <= endvalue),]
                    print (d)
                j= j+1
            }
        i = i+1
    }
d   

它还我。。。。。。你知道吗

[1] Col.1 Col.2 Col.3 Col.4 Col.5 Col.6 Col.7 Col.8
<0 rows> (or 0-length row.names)

但我期待着结果

        Col.1  Col.2  Col.3 Col.4 Col.5 Col.6 Col.7 Col.8

    2      6     7     8     9    10    11    12    13
    3     11    12    13    14    15    16    17    18
    6     26    27    28    29    30    31    32    33
    7     31    32    33    34    35    36    37    38
    8     36    37    38    39    40    41    42    43
    9     41    42    43    44    45    46    47    48

这是一个样本表,我有一个大数据约21000行有,这就是为什么我想做它与编程的帮助。如果在python中有可能,那么也建议我


Tags: inforreadfile1sheetrowsmalwarenrow
1条回答
网友
1楼 · 发布于 2024-06-08 22:58:38

R中,我们循环遍历第二个数据集的行序列,如果第二个数据集的每一行的“Col.8”值是从“starInterval”到“endInterval”的值序列,则删除这些行,并更新第一个数据集

for(i in seq_len(nrow(df2))) {

   df1 <- df1[!(df1$Col.8 %in% seq(df2$starInterval[i], df2$endInterval[i], by = 1)),]
  }

df1
#     Col.1 Col.2 Col.3 Col.4 Col.5 Col.6 Col.7 Col.8
#2     6     7     8     9    10    11    12    13
#3    11    12    13    14    15    16    17    18
#6    26    27    28    29    30    31    32    33
#7    31    32    33    34    35    36    37    38
#8    36    37    38    39    40    41    42    43
#9    41    42    43    44    45    46    47    48

其中'df1和'df2'是使用readxlXLConnect或其中一个包读取的excel数据的第一页和第二页

数据

df1 <- structure(list(Col.1 = c(1L, 6L, 11L, 16L, 21L, 26L, 31L, 36L, 
41L, 46L), Col.2 = c(2L, 7L, 12L, 17L, 22L, 27L, 32L, 37L, 42L, 
47L), Col.3 = c(3L, 8L, 13L, 18L, 23L, 28L, 33L, 38L, 43L, 48L
), Col.4 = c(4L, 9L, 14L, 19L, 24L, 29L, 34L, 39L, 44L, 49L), 
    Col.5 = c(5L, 10L, 15L, 20L, 25L, 30L, 35L, 40L, 45L, 50L
    ), Col.6 = c(6L, 11L, 16L, 21L, 26L, 31L, 36L, 41L, 46L, 
    51L), Col.7 = c(7L, 12L, 17L, 22L, 27L, 32L, 37L, 42L, 47L, 
    52L), Col.8 = c(8L, 13L, 18L, 23L, 28L, 33L, 38L, 43L, 48L, 
    53L)), .Names = c("Col.1", "Col.2", "Col.3", "Col.4", "Col.5", 
"Col.6", "Col.7", "Col.8"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10"))

df2 <- structure(list(starInterval = c(1L, 51L, 21L), endInterval = c(10L, 
70L, 30L)), .Names = c("starInterval", "endInterval"), class = "data.frame",
        row.names = c(NA, -3L))

相关问题 更多 >