R-从data.frame中删除行

时间:2018-11-07 23:33:53

标签: r if-statement delete-row

我对编程非常陌生,有一个基本问题(我的第一个关于stackoverflow的问题:)) 我想从data.frame删除一些行,并在该帐户上使用if语句。 我的代码正在运行,但是很遗憾,它没有删除正确的行,而是删除了我认为的数据框的第二行。

“ myDataVergleich”是我的data.frame的名称。 “ myData $ QUESTNNR”是一列,通过该列可以确定该行是否应该保留在数据框中。

for(i in 1:nrow(myDataVergleich))
  {if(myData$QUESTNNR[i] != "t0_mathe" | myData$QUESTNNR[i] != "t0_bio" | myData$QUESTNNR[i] != "t0_allg2" |
     myData$QUESTNNR[i] != "t7_mathe_Version1" | myData$QUESTNNR[i] != "t7_bio_Version1") 
    {myDataVergleich <- myDataVergleich[-c(i),] }}

我在做什么错了?

3 个答案:

答案 0 :(得分:1)

欢迎堆栈溢出和R。我认为您的直觉是正确的,但存在一些问题。首先,您说您的数据称为“ myDataVergleich”,但在循环中,您正在访问“ myData”。因此,您可能需要在循环中将“ myData $ QUESTNNR [i]”更改为“ myDataVergleich $ QUESTNNR [i]”。

R的一大优点是,人们已经为许多问题找到了解决方案,按条件子集设置数据帧就是其中之一。您应该研究tidyverse软件包家族,在这种情况下,尤其是dplyr。

install.packages('dplyr')
install.packages('magrittr')

如果您想使用这些字符串保留行,则此代码将起作用

library(dplyr)
library(magrittr)
strings <- c(
  "t0_mathe", "t0_bio", "t0_allg2", "t7_mathe_Version1", "t7_bio_Version1"
)
filtered_data <- myDataVergleich %>%
  dplyr::filter(QUESTNNR %in% strings)

如果您想保留不包含这些字符串的行,则此代码将起作用

library(dplyr)
library(magrittr)
strings <- c(
  "t0_mathe", "t0_bio", "t0_allg2", "t7_mathe_Version1", "t7_bio_Version1"
)
filtered_data <- myDataVergleich %>%
  dplyr::filter(!QUESTNNR %in% strings)

希望有帮助

答案 1 :(得分:0)

我将必须知道错误,QUESTNNR%in%字符串返回TRUE或FALSE并添加!只是返回相反的意思,所以应该没问题。您可以使用'stringr'包中的str_detect检测字符串的一部分。

library(dplyr)
library(stringr)
library(tibble)
library(magrittr)
df <- tibble(x = c('h', 'e', 'l', 'l', '0')) 
df %>% dplyr::filter(str_detect(x, 'l'))

答案 2 :(得分:0)

如果我尝试运行:

    strings <- c("t0_mathe", "t0_bio","t0_allg", "Anmeldung_zur_Studie") 
myDataVerlauf <- myDataVerlauf %>% dplyr::filter(!myData.QUESTNNR, strings) 

我收到以下错误消息:

filter_impl(.data,quo)中的错误:评估错误:仅数字,逻辑或复数类型可以进行操作。另外:警告消息:在Ops.factor(myData.QUESTNNR)中:“!”对因素没有意义–