簡體   English   中英

R 數據框中行的子集化

[英]Subsetting of rows in R data frame

我目前正在從網上抓取一些數據,數據示例如下所示:

    col_a | col_b | col_c | col_d
    1     | 2     | 44    | home1
    1     | 3     | 44    | home1
    1     | 7     | 44    | home1
    1     | 5     | 44    | home1
    1     | 2     | 44    | home1
    1     | 3     | 44    | home1
    1     | 7     | 44    | home1
    1     | 5     | 44    | home1
    2     | 8     | 42    | home1
    2     | 6     | 42    | home1
    2     | 4     | 42    | home1
    2     | 1     | 42    | home1

如上例所示,共有 12 行。 正確的數據應該只有8行數據,使用“col_a”作為參考,每個唯一的“col_a”應該只有4行。 因此,在這種情況下,第 5 行到第 8 行是第 1 行到第 4 行的重復項。話雖如此,抓取的數據有 100,000 多行,並且此類重復項到處都有。 有沒有辦法只保留每個唯一“col_a”的前 4 行? 除了遍歷每一行之外,我想不出一種有效的方法。

您可以使用以下命令獲取 col_a 中的不同值:

col_a_unique <- unique(data$col_a)

然后最終循環它並只保留每個的前四個:

for (a in col_a_unique)
{
 to_keep=data[which(data$col_a==a),][1:4]
}

wihch()將僅選擇滿足等式的行,即對應於 col_a 上給定值的所有元素,然后使用[1:4]選擇前四個元素。

然后您需要創建一個適當的對象來在每個循環步驟中存儲to_keep

這是一個詳細的方法,還有更簡潔的方法。

應該有一個騙局,但由於我找不到,我會寫一個答案。

使用dplyr ,我們可以做到

library(dplyr)
df %>% group_by(col_a) %>% slice(1:4)

#  col_a col_b col_c col_d
#  <int> <int> <int> <fct>
#1     1     2    44 home1
#2     1     3    44 home1
#3     1     7    44 home1
#4     1     5    44 home1
#5     2     8    42 home1
#6     2     6    42 home1
#7     2     4    42 home1
#8     2     1    42 home1

使用數據data.table

library(data.table)
setDT(df)[, .SD[1:4], by = col_a]

和基礎R。

df[with(df, ave(col_b, col_a, FUN = seq_along) <= 4), ]

data.tablerowid()的幫助下以R為基礎:

df[data.table::rowid(df$col_a) < 5, ]

#    col_a col_b col_c col_d
# 1      1     2    44 home1
# 2      1     3    44 home1
# 3      1     7    44 home1
# 4      1     5    44 home1
# 9      2     8    42 home1
# 10     2     6    42 home1
# 11     2     4    42 home1
# 12     2     1    42 home1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM