如何删除变量

时间:2018-04-22 12:26:45

标签: r dataframe row

在我的数据集num

num
structure(list(x1 = c(52L, 74L, 61L, 63L, 44L), x2 = c(32L, 96L, 
83L, 35L, 95L), x3 = c(9L, 36L, 7L, 33L, 67L), x4 = c(1L, 2L, 
3L, 2L, 3L), x5 = c(2017L, 2017L, 2017L, 2018L, 2018L)), .Names = c("x1", 
"x2", "x3", "x4", "x5"), class = "data.frame", row.names = c(NA, 
-5L))

有变量x4(数字)和x5(年)。 问题:2017年的x4变量值与2018年的x4变量值不匹配。 例如,在我可重复的示例中,我们可以看到2017年的变量x4具有数字1,但2018年没有数字1。 所以我们必须从数据集中删除数字1(即用它删除行)。 以及2017年存在的其他x4值,但不是2018年。 怎么样?

更新

确实2017年有406个数字,但在2018年原始数据集中有1500个数字。需要2017年和2018年的数字相同的代码,但在406到1500之后,2018年有数字吗?

以1500号码输入

structure(list(x1 = c(52L, 74L, 61L, 63L, 44L, 44L), x2 = c(32L, 
96L, 83L, 35L, 95L, 95L), x3 = c(9L, 36L, 7L, 33L, 67L, 67L), 
    x4 = c(1L, 2L, 3L, 2L, 3L, 1500L), x5 = c(2017L, 2017L, 2017L, 
    2018L, 2018L, 2018L)), .Names = c("x1", "x2", "x3", "x4", 
"x5"), class = "data.frame", row.names = c(NA, -6L))
输出中的

x1  x2  x3  x4       x5
74  96  36  2       2017
61  83  7   3       2017
63  35  33  2       2018
44  95  67  3       2018
44  95  67  1500    2018

3 个答案:

答案 0 :(得分:3)

您可以执行以下操作:

# Get x4 values present for all years
x4.all <- Reduce(
   function(a, b) intersect(a, b),
   lapply(split(num, num$x5), function(x) x$x4))

# Select entries where x4 is an element of x4.all
subset(num, x4 %in% x4.all)
#x1 x2 x3 x4   x5
#2 74 96 36  2 2017
#3 61 83  7  3 2017
#4 63 35 33  2 2018
#5 44 95 67  3 2018

说明:我们使用Reduce(function(a, b) intersect(a, b), ...)计算所有id4(年)组中x5值的交叉点;然后,我们根据所有年份中存在的x4.all值过滤条目。

答案 1 :(得分:1)

你可以,例如首先检索每年存在的数字,然后用它们索引。

Firebase Cloud Functions

答案 2 :(得分:1)

以下是tidyverse

的一个选项
library(dplyr)
nums %>%
   group_by(x4) %>% 
   filter(n_distinct(x5)  == n_distinct(.$x5))
# A tibble: 4 x 5
# Groups: x4 [2]
#     x1    x2    x3    x4    x5
#  <int> <int> <int> <int> <int>
#1    74    96    36     2  2017
#2    61    83     7     3  2017
#3    63    35    33     2  2018
#4    44    95    67     3  2018