我有一个df
,每12行重复标题行,这是ESPN网站上刮擦MLB投球统计数据的遗留物。我知道我可以像这样简单地删除它们:
12 RK PLAYER TEAM GP GS IP H R ER BB SO W L SV BLSV WAR WHIP ERA
...
24 RK PlAYER etc...
df <- df[c(-12, -24, -36, -48, -etc), ]
这似乎效率很低,因为我的df
长超过一千行。如何删除这些标题行,而不必键入从12到Timbuktu的每个数字?
答案 0 :(得分:4)
使用seq
创建一个序列,并使用该序列删除行
df[-seq(12, nrow(df), by = 12),]
如果它是data.table
对象,则不需要,
library(data.table)
df[-seq(12, .N, by = 12)]
或使用dplyr
library(dplyr)
df %>%
slice(-seq(12, n(), by = 12))
基于OP的注释,目的是删除从here读取的数据中的重复标题。
删除RK列值为“ RK”的行(指定标题行)
df <- df[df$RK != "RK",]
然后更改列的type
df[] <- lapply(df, function(x) type.convert(as.character(x), as.is = TRUE))
答案 1 :(得分:3)
一个选项是在除以remainder
之后检查12
。排除remainder
为0
的行:
df[(1:nrow(df) %% 12) !=0,]
对于data.table
,可以将.I
用作:
df[df[,(.I %% 12 != 0)]]
它如何工作?说,您的data.frame
得到了36行:
(1:36 %% 12) != 0
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
# [12] FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
# [23] TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
# [34] TRUE TRUE FALSE
请注意,12th
,24th
和36th
是FALSE
。因此,这些行将被排除。