【问题标题】:How to generate a "range" variable in R? [duplicate]如何在 R 中生成“范围”变量? [复制]
【发布时间】:2016-07-14 19:50:38
【问题描述】:

我有一个看起来像这样的数据集:

    Subject Year    X
       A    1990    1
       A    1991    1
       A    1992    2
       A    1993    3
       A    1994    4
       A    1995    4
       B    1990    0
       B    1991    1
       B    1992    1
       B    1993    2
       C    1991    1
       C    1992    2
       C    1993    3
       C    1994    3
       D    1991    1
       D    1992    2
       D    1993    3
       D    1994    4
       D    1995    5
       D    1996    5
       D    1997    6

我想为每个主题生成一个二进制 (0/1) 变量(假设变量 A),它指示 X 变量已达到 3(或 1-3)的天气。如果 X 变量已达到 4 或更多,则 A 不应捕获它。

应该是这样的:

Subject Year    X   A
   A    1990    1   0
   A    1991    1   0
   A    1992    2   0
   A    1993    3   0
   A    1994    4   0
   A    1995    4   0
   B    1990    0   0
   B    1991    1   0
   B    1992    1   0
   B    1993    2   0
   C    1991    1   1
   C    1992    2   1
   C    1993    3   1
   C    1994    3   1
   D    1991    1   0
   D    1992    2   0
   D    1993    3   0
   D    1994    4   0
   D    1995    5   0
   D    1996    5   0
   D    1997    6   0

我尝试了以下方法:mydata$A<- as.numeric(mydata$X %in% 1:3)但它不能控制继续......

一个可重复的样本:

> dput(mydata)
structure(list(Subject = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), .Label = c("A", 
"B", "C", "D"), class = "factor"), Year = c(1990L, 1991L, 1992L, 
1993L, 1994L, 1995L, 1990L, 1991L, 1992L, 1993L, 1991L, 1992L, 
1993L, 1994L, 1991L, 1992L, 1993L, 1994L, 1995L, 1996L, 1997L
), X = c(1L, 1L, 2L, 3L, 4L, 4L, 0L, 1L, 1L, 2L, 1L, 2L, 3L, 
3L, 1L, 2L, 3L, 4L, 5L, 5L, 6L)), .Names = c("Subject", "Year", 
"X"), class = "data.frame", row.names = c(NA, -21L))

欢迎所有建议 - 谢谢!

【问题讨论】:

  • 如果 x 的最大值为 3,那么 A 应该为 1?
  • 如果主题 E 的值为 2 和 3,您要标记它吗?还是必须是 1,2,3? 2,3,1...
  • 老实说,这个问题并不清楚。通过提供明确的问题帮助用户帮助您。
  • @SabDeM 请让我有什么不清楚的地方。我会尽量说清楚。
  • @zx8754 抱歉,我不清楚。 X 是一个累积变量。

标签: r function dataframe


【解决方案1】:

这是一个基本的 R 单线使用ave

df$A <- ave(df$X, df$Subject, FUN = function(x) if (max(x) == 3) 1 else 0)

> df
   Subject Year X A
1        A 1990 1 0
2        A 1991 1 0
3        A 1992 2 0
4        A 1993 3 0
5        A 1994 4 0
6        A 1995 4 0
7        B 1990 0 0
8        B 1991 1 0
9        B 1992 1 0
10       B 1993 2 0
11       C 1991 1 1
12       C 1992 2 1
13       C 1993 3 1
14       C 1994 3 1
15       D 1991 1 0
16       D 1992 2 0
17       D 1993 3 0
18       D 1994 4 0
19       D 1995 5 0
20       D 1996 5 0
21       D 1997 6 0

【讨论】:

  • 你有 C 1994 3 1 ,但 OP 说它应该是 0
  • 谢谢,我已经更新了这个问题,但我想我可以将它作为一个新问题发布。但是这段代码运行良好!
  • 也可能只是(ave(df$X, df$Subject, FUN = max) == 3) + 0
  • @Zelazny7 如果你有时间,请检查这个问题:stackoverflow.com/questions/38385351/…
【解决方案2】:

然后,如果您只想捕获增加,可以使用移位功能访问其他行。此解决方案有效,但第一个值为 NA,因为它没有可比性

mydata$A <- ifelse(mydata$X > shift(mydata$X, 1L, type="lag"), 1,0) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 2017-03-26
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    相关资源
    最近更新 更多