[英]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.table
的rowid()
的幫助下以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.