【问题标题】:How can I create a new column in a dataframe based on subset of the same data如何根据相同数据的子集在数据框中创建新列
【发布时间】:2018-02-26 20:46:51
【问题描述】:

对不起,如果这是一个愚蠢的问题,我是 R 新手。 我有一个这样的数据集:

   t a b
1  1 1 0
2  2 1 0
3  3 1 4
4  4 1 0
5  5 1 2
6  1 2 0
7  2 2 1
8  3 2 3
9  4 2 0
10 5 2 5

我想添加一个新列c,如果b 为零并且之前没有由a 分组的b 不为零,则该列打开,否则为零。基本上,我想根据t 索引为每个a 标记前导零。结果应如下所示:

   t a b c
1  1 1 0 1
2  2 1 0 1
3  3 1 4 0
4  4 1 0 0
5  5 1 2 0
6  1 2 0 1
7  2 2 1 0
8  3 2 3 0
9  4 2 0 0
10 5 2 5 0

我试过跑步

data.c <- ifelse(nrow(subset(data, t < data$t & a == data$a & b != 0)) == 0 & data$b == 0, 1, 0)

但是如果 b 为 0,则将 c 设置为 1。我做错了什么?你会如何处理这个问题? 谢谢

可重现的例子:

t <- "time a b 
1 1 1 0
2 2 1 0
3 3 1 4
4 4 1 0
5 5 1 2
6 1 2 0
7 2 2 3
8 4 2 5
9 4 2 0"

data <- read.table(text=t, header = TRUE)

data$c <- ifelse(nrow(subset(data, t < data$t & a == data$a & b != 0)) == 0 & data$b == 0, 1, 0)

【问题讨论】:

  • 愿意提供一个可重现的例子吗?
  • 当然,添加了一个可重现的示例。

标签: r subset


【解决方案1】:

下面使用dplyrcumsum怎么样:

require(dplyr);
df %>%
    group_by(a) %>%
    arrange(a, time) %>%
    mutate(c = ifelse(b != 0 | cumsum(b) > 0, 0, 1)) %>%
    ungroup();
#    time     a     b     c
#   <int> <int> <int> <dbl>
# 1     1     1     0  1.00
# 2     2     1     0  1.00
# 3     3     1     4  0
# 4     4     1     0  0
# 5     5     1     2  0
# 6     1     2     0  1.00
# 7     2     2     1  0
# 8     3     2     3  0
# 9     4     2     0  0
#10     5     2     5  0

样本数据

df <- read.table(text =
    "time a b
1     1 1 0
2     2 1 0
3     3 1 4
4     4 1 0
5     5 1 2
6     1 2 0
7     2 2 1
8     3 2 3
9     4 2 0
10    5 2 5", header = T)

【讨论】:

  • 谢谢,安装 dplyr 和 magrittr 后,这工作了。为什么这行得通,而子集却不行?
  • 不完全确定。 nrow(subset(data, t &lt; data$t &amp; a == data$a &amp; b != 0)) 将始终为零,因为 t 未在任何地方定义。您也不需要在subset 中明确引用data。例如。使用subset(data, time == 2) 而不是subset(data, data$time == 2)
猜你喜欢
  • 2011-09-10
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 2020-04-12
相关资源
最近更新 更多