我对编程非常陌生,有一个基本问题(我的第一个关于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),] }}
我在做什么错了?
答案 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)中:“!”对因素没有意义–