如何生成一个";“范围”;R中的变量?
我有一个类似以下内容的数据集:如何生成一个";“范围”;R中的变量?,r,function,dataframe,R,Function,Dataframe,我有一个类似以下内容的数据集: 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 19
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这里有一个基本的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
df$A df
科目年份X A
1A 1990 10
2 A 1991 10
3 A 1992 2 0
4 A 1993 3 0
5 A 1994 4 0
6 A 1995 4 0
7 B 1990 0
8 B 1991 10
9 B 1992 1 0
10 B 1993 2 0
11 C 1991 1
12 C 1992 2 1
13 C 1993 3 1
14 C 1994 3 1
15 D 1991 10
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
然后,如果您只想捕获增量,则可以使用shift功能访问其他行。这个解决方案是可行的,但第一个值是NA,因为它没有任何可比性
mydata$A <- ifelse(mydata$X > shift(mydata$X, 1L, type="lag"), 1,0)
mydata$A班次(mydata$X,1L,type=“lag”),1,0)
如果最大x值为3,那么A应该是1?如果受试者E
的值为2和3,您想标记它吗?还是必须是1,2,3?2,3,1怎么样……老实说,问题还不清楚。通过提供清晰的问题来帮助用户。@SabDeM请告诉我不清楚的地方。我会尽量弄清楚的。@zx8754对不起,我不清楚。X是一个累积变量。你有C1994 3 1
,但OP说应该是0谢谢,我已经更新了这个问题,但我想我可以把它作为一个新问题发布。但是这个代码工作得很好!也只是(ave(df$X,df$Subject,FUN=max)==3)+0
probably@Zelazny7如果您有时间,请检查以下问题:
mydata$A <- ifelse(mydata$X > shift(mydata$X, 1L, type="lag"), 1,0)