我可以轻松地使用以下方法对数据帧的前一半(或其他百分比)进行切片:
library(dplyr)
df <- data.frame(x = 1:10)
df %>%
slice(seq(0.5 * n()))
但是,如何分割数据帧的后半部分?
答案 0 :(得分:4)
带有负索引
library(dplyr)
df <- data.frame(x = 1:10)
df %>%
slice(-seq(0.5 * n()))
答案 1 :(得分:2)
您还可以稍微修改seq
参数:
df <- data.frame(x = 1:10)
df %>%
slice(seq(n() * 0.5, n()))
根据@Kerry Jackson的建议进行更新:
df %>%
slice(seq(floor(n() * 0.5) + 1, n()))
如果行数奇数-您需要选择如何处理中间行。
答案 2 :(得分:2)
slice()
可以做两件事:如果给它正数,则保留行;如果给负数,则保留行。您可以使用其中任何一个来获取数据帧的后半部分:
# Keeping later rows
df %>% slice(seq(n()/2, n()))
# Dropping earlier rows
df %>% slice(-seq(1, n()/2))
如果行数为奇数,则需要小心,因为在这些情况下n()/2
不会是整数。在您的示例中使用seq(0.5 * n())
也会遇到此问题。为了安全起见,您可以明确说明如何使用floor()
和ceiling()
处理中间情况:
df <- data.frame(x = 1:11)
# Include row 5
df %>% slice(seq(floor(n()/2), n()))
# Exclude row 5
df %>% slice(seq(ceiling(n()/2), n()))