R:选择或者,但不是两者都选

时间:2015-07-16 03:46:02

标签: r operators xor grepl

我对编码非常陌生,所以请原谅我,如果这应该很容易解决或找到 - 也许这很简单,到目前为止没有人打扰解释或者我没有用正确的关键词进行搜索。 / p>

我的数据集中有一列包含所有可能组合中的字母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或n条目的子集,但不是fi,ni等,这不是我想要的,使用此代码:

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

并创建一个包含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)),]

它只是给了我一个充满NA的数据帧。但即使这确实有效,我想我只能制作一个包含四组f,n,fi和ni的箱线图,我只想要两组。那么我怎样才能使代码工作,我该如何继续呢?

我希望这对第一个问题来说并不太可怕!在这花了太多时间之后,我有点茫然。任何帮助,关于我的问题,在哪里寻找答案或如何改进问题都非常感谢!

2 个答案:

答案 0 :(得分:3)

我认为你的最后一个例子非常接近。 xor仅适用于返回logical的内容,例如TRUEFALSE,但match实际上返回整数位置。因此,只需将greplxor

一起使用即可
xor(grepl("f", df$D), grepl("n", df$D))

或者你可以得到幻想:

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

答案 1 :(得分: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)

请注意,这是 bar 图,而不是图,因为框图只会绘制连续值的范围,而您没有指定什么是连续的值或它们的样子。但是如果你确实有这样一个变量,比如df$myvalue,那么你可以用:

生成一个箱形图
# simulate some continuous data
set.seed(50)
df$myvalue <- runif(nrow(df))

boxplot(myvalue ~ has_only, data = df)