根据列子集数据框

时间:2016-09-25 19:18:37

标签: r subset

我想根据一列中的值从数据中删除某些行。我尝试过几种方法:

#reads in data
sbc016formants.df <- read.table("file path", sep="\t", header = F, strip.white = T)

# names columns
names(sbc016formants.df) <- c("fileName", "start", "end", "vowelLabel")

# list of values I want to remove
list16 <- c(615.162, 775.885)

# produces a subset of data - removes rows with values from list 16 in the start column
sbc016formants.df <- subset(sbc016formants.df, !start %in% list16)

为某些但不是所有数据文件生成此错误消息:

Error in match(x, table, nomatch = 0L) : 
'match' requires vector arguments

我也根据this主题

中的第二个答案尝试了这一点
sbc002formants.df <- sbc002formants.df[ apply(sbc002formants.df, 1 , function(x) any(unlist(x) %in% list2) ) , ]

这消除了列表中的一些项目(list16),但不是全部。我想使用第一个答案,但我不理解代码(我不确定bl是什么,在示例中)。

以下是制作可重现示例的代码:

# creates dataframe
fileName <- c("sbc016", "sbc016", "sbc016", "sbc016")
start <- c(1.345, 2.345, 615.162, 775.885)
end <- c(100.345, 200.345, 715.162, 875.885)
sbc016formants.df <- data.frame(fileName, start, end)

# list of what I want to get rid of
list16 <- c(615.162, 775.885)

1 个答案:

答案 0 :(得分:1)

假设我正确理解了这个问题,dplyr应该能够轻松有效地完成这项工作。

fileName <- c("sbc016", "sbc016", "sbc016", "sbc016")
start <- c(1.345, 2.345, 615.162, 775.885)
end <- c(100.345, 200.345, 715.162, 875.885)
sbc016formants.df <- data.frame(fileName, start, end)

# list of what I want to get rid of
list16 <- c(615.162, 775.885)

install.packages("dplyr", dependencies = TRUE)
library(dplyr)
sbc016formants.df %>% filter(!start %in% list16)

sbc016formants.df %>% filter(start != list16)