从R中的数据中提取具有特征条件的行

时间:2018-06-08 11:16:56

标签: r select rstudio

我有一个数据集,我在RStudio中加载,包含6个输入功能和2个输出,有4000个观察。我想从这个数据构建另一个包含5个输入要素的固定值的数据集,并且只有一个输入变化。让我们说我的数据是由:

In1 In2 In3 In4 In5 In6 Out1 Out2
4    3   2   4   2   10  0.4  0.5
4    3   2   3   2   7   0.6  0.8
2    3   1   4   2   9   0.2  0.1
4    3   2   4   2   8   0.8  0.7
4    5   6   4   2   1   0.9  0.1
4    3   2   4   2   3   0.4  0.5

我想获得的是(除了In6,所有输入都是常数)

In1 In2 In3 In4 In5 In6 Out1 Out2
4    3   2   4   2   10  0.4  0.5
4    3   2   4   2   8   0.8  0.7
4    3   2   4   2   3   0.4  0.5

我怎样才能在R中这样做? 非常感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

这会从输入中产生请求的输出,但我不知道它是否适用于更广泛的情况。

首先,我定义数据框df

df <- read.table(text = "In1 In2 In3 In4 In5 In6 Out1 Out2
4    3   2   4   2   10  0.4  0.5
4    3   2   3   2   7   0.6  0.8
2    3   1   4   2   9   0.2  0.1
4    3   2   4   2   8   0.8  0.7
4    5   6   4   2   1   0.9  0.1
4    3   2   4   2   3   0.4  0.5", header = TRUE)

然后,我在第1列到第5列中查找重复的行。

df[duplicated(df[, 1:5])|duplicated(df[, 1:5], fromLast = TRUE),]

#   In1 In2 In3 In4 In5 In6 Out1 Out2
# 1   4   3   2   4   2  10  0.4  0.5
# 4   4   3   2   4   2   8  0.8  0.7
# 6   4   3   2   4   2   3  0.4  0.5

这会尝试所有可能的输入组合。我找到了6个输入中5列的所有可能组合。

col_combinations <- combn(1:6, 5)

然后,我测试每个。

apply(col_combinations, MAR = 2, 
      function(x)df[duplicated(df[, x])|duplicated(df[, x], fromLast = TRUE),])

如您所见,只有一个是成功的。

# [[1]]
#   In1 In2 In3 In4 In5 In6 Out1 Out2
# 1   4   3   2   4   2  10  0.4  0.5
# 4   4   3   2   4   2   8  0.8  0.7
# 6   4   3   2   4   2   3  0.4  0.5
# 
# [[2]]
# [1] In1  In2  In3  In4  In5  In6  Out1 Out2
# <0 rows> (or 0-length row.names)
# 
# [[3]]
# [1] In1  In2  In3  In4  In5  In6  Out1 Out2
# <0 rows> (or 0-length row.names)
# 
# [[4]]
# [1] In1  In2  In3  In4  In5  In6  Out1 Out2
# <0 rows> (or 0-length row.names)
# 
# [[5]]
# [1] In1  In2  In3  In4  In5  In6  Out1 Out2
# <0 rows> (or 0-length row.names)
# 
# [[6]]
# [1] In1  In2  In3  In4  In5  In6  Out1 Out2
# <0 rows> (or 0-length row.names)

答案 1 :(得分:1)

df = read.table(text = "
In1 In2 In3 In4 In5 In6 Out1 Out2
                4    3   2   4   2   10  0.4  0.5
                4    3   2   3   2   7   0.6  0.8
                2    3   1   4   2   9   0.2  0.1
                4    3   2   4   2   8   0.8  0.7
                4    5   6   4   2   1   0.9  0.1
                4    3   2   4   2   3   0.4  0.5
                ", header=T)

library(dplyr)

df %>%
  group_by(In1,In2,In3,In4,In5) %>%  # for those variables
  mutate(n = n()) %>%                # count number of combination and add it as a column
  ungroup() %>%                      # forget the grouping
  filter(n == max(n)) %>%            # return the rows with the most popular combination
  select(-n)                         # remove the counts

# # A tibble: 3 x 8
#     In1   In2   In3   In4   In5   In6  Out1  Out2
#   <int> <int> <int> <int> <int> <int> <dbl> <dbl>
# 1     4     3     2     4     2    10   0.4   0.5
# 2     4     3     2     4     2     8   0.8   0.7
# 3     4     3     2     4     2     3   0.4   0.5

这种方法假设您总是拥有一个胜利者组合,并且您只关心该胜利者组合。