2015-07-16 6 views
-1

Я абсолютно не знаком с кодированием, поэтому, пожалуйста, простите меня, если это должно быть очень легко решить или найти - может быть, это так просто, что никто до сих пор не объяснил, t поиск с правильными ключевыми словами.R: Выберите один или, но не оба

У меня есть столбец в моем наборе данных, который содержит буквы f, n, i во всех возможных комбинациях. Теперь я хочу найти только те строки, которые содержат либо f, либо n, но не оба. Таким образом, это может быть f, или fi, или n, или ni. Затем я хочу сравнить эти два набора строк друг с другом в ящике. Поэтому в идеале у меня было бы две коробки: одна со всеми точками данных, принадлежащими группе f, включая fi, и одна со всеми точками данных, принадлежащими группе n, включая ni.

Пример моего набора данных:

df <- data.frame(D = c("f", "f", "fi", "n", "ni", "ni", "fn", "fn"), y = c(1, 0.8, 1.1, 2.1, 0.9, 8.8, 1.7, 5.4)) 

    D y 
1 f 1.0 
2 f 0.8 
3 fi 1.1 
4 n 2.1 
5 ni 0.9 
6 ni 8.8 
7 fn 1.7 
8 fn 5.4 

Теперь то, что я хочу, чтобы это подмножество:

D y 
1 f 1.0 
2 f 0.8 
3 fi 1.1 
4 n 2.1 
5 ni 0.9 
6 ni 8.8 

, а затем как-то 1,2,3 и 4,5,6 в каждой группы, чтобы построить в ящике.

До сих пор я только удалось получить подмножество, которое имеет только записи с либо F или п, но не фи, щ и т.д., которые не то, что я хочу с этим кодом:

df2<-df[df$D==c("f","n"),] 

и в создании подмножество, которое имеет все различные группы с е и п:

df2 <- df[grepl("f", df$D) | grepl("n", bat.df$D),] 

Я читал о «исключающего или» оператора XOR, но когда я пытаюсь использовать это так:

df2 <- bat.df[xor(match("n", df$D), match("f", df$D)),] 

это просто дает мне полный набор данных. Но даже если бы это сработало, я думаю, что я мог бы сделать коробку с четырьмя группами, f, n, fi и ni, где мне нужны только две группы. Итак, как я могу заставить этот код работать, и как я могу продолжить?

Надеюсь, это не слишком страшно для первого вопроса! Я немного смущен, когда трачу слишком много времени на это. Любая помощь, о моей проблеме, о том, где искать ответ или о том, как улучшить вопрос, очень ценится!

+3

воспроизводимые пример? –

+0

Показывает несколько строк набора данных (со всеми различными комбинациями) и указывает, какие строки вы хотите выбрать, предоставит воспроизводимый набор данных и ответ, который может быть нацелен в решении. Звучит довольно просто. –

+0

Будет ли 'test <- c (« i »,« f »,« n »,« fi »,« ni »,« fn »)' быть репрезентативными для ваших данных? – thelatemail

ответ

0

Мы все вырезать зубы на R в каком-то момент, поэтому я попытаюсь построить пример для вас, что подходит к вопросу. Как насчет:

# simulate a data.frame with "all possible combinations" of singles and pairs 
df <- data.frame(txt = as.character(outer(c("i", "f", "n"), c("", "i", "f", "n"), paste0)), 
       stringsAsFactors = FALSE) 
# create an empty factor variable to contain the result 
df$has_only <- factor(rep(NA, nrow(df)), levels = 1:2, labels = c("f", "n")) 
# replace with codes if contains either f or n, not both(f, n) 
df$has_only[which(grepl("f", df$txt) & !grepl("f.*n|n.*f", df$txt))] <- "f" 
df$has_only[which(grepl("n", df$txt) & !grepl("f.*n|n.*f", df$txt))] <- "n" 
df 
## txt has_only 
## 1 i  <NA> 
## 2 f  f 
## 3 n  n 
## 4 ii  <NA> 
## 5 fi  f 
## 6 ni  n 
## 7 if  f 
## 8 ff  f 
## 9 nf  <NA> 
## 10 in  n 
## 11 fn  <NA> 
## 12 nn  n 
plot(df$has_only) 

Обратите внимание, что это является бар участок, не коробка участок, так как коробка сюжет будет только построить ряд непрерывных значений, и вы не указали, что являются непрерывные значения или как они будут выглядеть.Но если вы сделали такой переменной, скажем df$myvalue, то вы могли бы производить коробки участок с:

# simulate some continuous data 
set.seed(50) 
df$myvalue <- runif(nrow(df)) 

boxplot(myvalue ~ has_only, data = df) 
2

Я думаю, что ваш последний пример довольно близок. xor работает только с вещами, которые возвращают logical, как TRUE и FALSE, но match фактически возвращает целочисленное положение. Так просто использовать grepl с xor:

xor(grepl("f", df$D), grepl("n", df$D)) 

Или вы могли бы получить фантазии:

library(functional) 
Reduce(xor, lapply(c("f", "n"), grepl, df$D)) 
+0

спасибо, вот что я искал! :) – borzoi

 Смежные вопросы

  • Нет связанных вопросов^_^