R : Select 要么,但不能同时
R : Select either or, but not both
我完全不熟悉编码,所以请原谅我,如果这应该很容易解决或找到 - 也许它太简单了,到目前为止没有人费心去解释,或者我只是没有用正确的关键字搜索.
我的数据集中有一列包含字母 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),]
我读到了 "exclusive or" 运算符 xor 但是当我尝试像这样使用它时:
df2 <- bat.df[xor(match("n", df$D), match("f", df$D)),]
它只是给了我一个充满 NA 的数据框。但即使这确实有效,我想我也只能制作一个包含四个组 f、n、fi 和 ni 的箱线图,我只需要两个组。那么我怎样才能让代码工作,我该如何继续呢?
我希望第一个问题不会太糟糕!在这上面花了太多时间后,我有点睡眼惺忪。非常感谢任何关于我的问题、在哪里寻找答案或如何改进问题的帮助!
我认为你的最后一个例子非常接近。 xor
仅适用于 return logical
的东西,例如 TRUE
和 FALSE
,但 match
实际上 return 是整数位置。所以只需使用 grepl
和 xor
:
xor(grepl("f", df$D), grepl("n", df$D))
或者你可能会喜欢:
library(functional)
Reduce(xor, lapply(c("f", "n"), grepl, df$D))
我们都曾在某个时候学习过 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 图,而不是 box 图,因为箱形图只会绘制连续值的范围,并且您尚未指定连续值是什么或它们的外观。但是如果你确实有这样一个变量,比如 df$myvalue
,那么你可以生成一个箱线图:
# simulate some continuous data
set.seed(50)
df$myvalue <- runif(nrow(df))
boxplot(myvalue ~ has_only, data = df)
我完全不熟悉编码,所以请原谅我,如果这应该很容易解决或找到 - 也许它太简单了,到目前为止没有人费心去解释,或者我只是没有用正确的关键字搜索.
我的数据集中有一列包含字母 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),]
我读到了 "exclusive or" 运算符 xor 但是当我尝试像这样使用它时:
df2 <- bat.df[xor(match("n", df$D), match("f", df$D)),]
它只是给了我一个充满 NA 的数据框。但即使这确实有效,我想我也只能制作一个包含四个组 f、n、fi 和 ni 的箱线图,我只需要两个组。那么我怎样才能让代码工作,我该如何继续呢?
我希望第一个问题不会太糟糕!在这上面花了太多时间后,我有点睡眼惺忪。非常感谢任何关于我的问题、在哪里寻找答案或如何改进问题的帮助!
我认为你的最后一个例子非常接近。 xor
仅适用于 return logical
的东西,例如 TRUE
和 FALSE
,但 match
实际上 return 是整数位置。所以只需使用 grepl
和 xor
:
xor(grepl("f", df$D), grepl("n", df$D))
或者你可能会喜欢:
library(functional)
Reduce(xor, lapply(c("f", "n"), grepl, df$D))
我们都曾在某个时候学习过 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 图,而不是 box 图,因为箱形图只会绘制连续值的范围,并且您尚未指定连续值是什么或它们的外观。但是如果你确实有这样一个变量,比如 df$myvalue
,那么你可以生成一个箱线图:
# simulate some continuous data
set.seed(50)
df$myvalue <- runif(nrow(df))
boxplot(myvalue ~ has_only, data = df)