使用完全字符串的row.names过滤掉表行

时间:2015-03-12 18:39:26

标签: r string

我正在尝试根据row.names列对数据进行子集化。我的删除矢量可能包含超过30个标题。我想通过使用像这样工作的东西从我的集合中删除整行数据(虽然这显然不起作用)。我可以修改线性回归模型,也可以只修改原始数据集。

remove = -c("I Am A Movie", "I Am Also A Movie", "Avengers", "etc") 
IVOD = lm(IVOD, subset=remove)

我的数据看起来像这样,有500多行,另外还有60多列。

    row.names       IVOD_REV_ULT    DBO    
1   I Am A Movie    1234567.91      1234670
2   Avengers        123456.99       1234567

如何创建字符串向量,并仅删除匹配的行,完全,row.names字符串?这与数字向量一起工作,但是对于那些重复这个过程的人来说,即使我不熟悉R,我也需要他们能够看到被删除的电影的实际名称,以避免在订购数据时出现任何错误不同。 有些电影可能有相同的初始字符串(即“黑暗骑士”和“黑暗骑士崛起”),所以我还需要删除命令才能删除完美匹配。

提前致谢 - 如果这比我想象的要容易,请道歉。我已经研究了2天,但找不到办法让它发挥作用。

4 个答案:

答案 0 :(得分:1)

试试这个:

df <- data.frame(row.names = c("apple", "banana", "orange", "lemon", "lime"), 
             value = c(1:5))
remove_these <- c("apple", "orange")

现在我们找到需要删除的行的索引

rows_to_remove <- which(row.names(df) %in% remove_these)

使用您之前尝试使用的相同技术来删除行。

df <- df[-rows_to_remove,]

答案 1 :(得分:1)

我更喜欢使用data.table的子集函数来执行此操作。下面是我如何使用data.table。

  library (data.table)
  library (random)
  library (dplyr)

  #create a fake dataset with movie names and rating
  set.seed (5280)
  foo.data <- data.table (movie.name = as.character (randomStrings (n = 25, len = 2, digits = FALSE)), rating = as.integer (runif (n = 25, min = 0, max = 5)))

  #create a dataset of movie names to remove
  remove <- sample_n (foo.data, size = 10)

  #remove the movies using data.table subset
  new.foo.data <- subset (foo.data, !movie.name %in% remove$movie.name)

答案 2 :(得分:0)

df <- data.frame(states = state.name, region = state.region)
head(df)
#       states region
# 1    Alabama  South
# 2     Alaska   West
# 3    Arizona   West
# 4   Arkansas  South
# 5 California   West
# 6   Colorado   West

remove <- c("Arkansas|Florida")
grepl(remove, df$states)
# [1] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [18] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# [35] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

df[grepl(remove, df$states), ]

#     states region
# 4 Arkansas  South
# 9  Florida  South

df[!grepl(remove, df$states), ] # answer
# or subset(df, !grepl(remove, df$states))

在一天结束时,在|或其变体中的正则表达式中使用管道grepl运算符(请参阅?grep

答案 3 :(得分:0)

有两种方法 首先,这是一个包含大量行的假装数据集。这不是您的分析,只是制作一个看起来非常像您的数据集。

movie.url <- "http://vincentarelbundock.github.io/Rdatasets/csv/ggplot2/movies.csv"
download.file(movie.url, "movies.csv")
movie.data <- read.csv("movies.csv", stringsAsFactors=FALSE)
row.names <- unique(movie.data$title)
IVOD_REV_ULT <- round(runif(n=length(row.names), min=123456, max=234567), digits=1)
DBO <- round(runif(n=length(row.names), min=123456, max=234567), digits=0)
df <- as.data.frame(cbind(row.names, IVOD_REV_ULT, DBO))
df$IVOD_REV_ULT <- as.numeric(df$IVOD_REV_ULT)

现在我们有一些与您粘贴的结构相匹配的东西。

看起来您正在尝试进行回归?要做到这一点,你需要先放置因变量,然后是波形符,然后是所有自变量。如果您使用&#34; subset&#34;,一种方法是使用%in%。 (或者在这种情况下,否定它,以便它不在。

删除部分电影后进行回归。

remove <-  c("Princess Bride, The", "Avengers, The", "Fast and Furious") 
IVOD <- lm(IVOD_REV_ULT ~ DBO, data=df, subset=!row.names %in% remove)

我毫不犹豫地使用&#34; grep&#34;因为它匹配部分字符串。因此,例如,所有快速和激烈的续集都将被删除,而不仅仅是我上面指定的那个。

在回归上下文之外,您可以明确地删除它们,如下所示:

subset <- df[!df$row.names %in% remove, ]

...或

subset <- df[-which(df$row.names %in% remove), ]

...虽然我认为使用&#34;其中&#34;增加了一些不必要的步骤。