我有一个巨大的数据框,需要基于其他三个值添加一个新变量。 新变量必须是数字变量,并取决于变量“隔间”,“图解”和“日期”。在每个隔间中,我将为图x的日期说1:10(如果有十个日期),图y的日期11:20(也有十个日期),图z的日期21:25(如果有五个日期)和以此类推。通常,每个带有每个隔间的地块的日期都相同,但是会发生例外。
因此,对于每个绘图-日期组合,我需要一个数字值,并且对于每个绘图,它们必须按时间顺序排列。
此帖子:R code: how to generate variable based on multiple conditions from other variables 给出了有关如何根据其他变量的条件创建变量的解决方案,但是如果我必须为每个df中的每个组合重新键入该变量,则将花费我几天的时间和大量的代码。
是否有解决此问题的通用方法?有循环之类的东西吗?到目前为止,我想不出什么更好的方法了,然后在每个图的df中分割df并将新变量与ifelse链接起来(在ifelse中为ifelse ...)。然后再将它们链接起来。但这对于我拥有的数据量是不可能的。
我确实已经在每个隔间中拆分了较大的df,这应该有助于某些解决方案。
虚拟代码(请注意,所有隔离专区在真实数据中均具有不同的地块名称,每个隔离专区甚至是地块之间的日期有时也有所不同,每个组合的观察数也是如此):
# Dataframe
Comp <- rep(c("A","B","C"), each=20)
Date <- rep(rep(c("2018-01-01", "2018-01-02", "2018-01-03", "2018-01-04", "2018-01-05"), times=4),times=3)
Plot <- rep(rep(c("P1", "P2", "P3", "P4"), each=5),times=3)
df <- data.frame(Comp, Date, Plot)
# Expected result
Comp Date Plot T
1 A 2018-01-01 P1 1
2 A 2018-01-02 P1 2
3 A 2018-01-03 P1 3
4 A 2018-01-04 P1 4
5 A 2018-01-05 P1 5
6 A 2018-01-01 P2 6
7 A 2018-01-02 P2 7
8 A 2018-01-03 P2 8
9 A 2018-01-04 P2 9
10 A 2018-01-05 P2 10
11 A 2018-01-01 P3 11
12 A 2018-01-02 P3 12
13 A 2018-01-03 P3 13
14 A 2018-01-04 P3 14
15 A 2018-01-05 P3 15
16 A 2018-01-01 P4 16
17 A 2018-01-02 P4 17
18 A 2018-01-03 P4 18
19 A 2018-01-04 P4 19
20 A 2018-01-05 P4 20
21 B 2018-01-01 P1 1
22 B 2018-01-02 P1 2
23 B 2018-01-03 P1 3
24 B 2018-01-04 P1 4
25 B 2018-01-05 P1 5
26 B 2018-01-01 P2 6
27 B 2018-01-02 P2 7
28 B 2018-01-03 P2 8
29 B 2018-01-04 P2 9
30 B 2018-01-05 P2 10
31 B 2018-01-01 P3 11
32 B 2018-01-02 P3 12
33 B 2018-01-03 P3 13
34 B 2018-01-04 P3 14
35 B 2018-01-05 P3 15
36 B 2018-01-01 P4 16
37 B 2018-01-02 P4 17
38 B 2018-01-03 P4 18
39 B 2018-01-04 P4 19
40 B 2018-01-05 P4 20
41 C 2018-01-01 P1 1
42 C 2018-01-02 P1 2
43 C 2018-01-03 P1 3
44 C 2018-01-04 P1 4
45 C 2018-01-05 P1 5
46 C 2018-01-01 P2 6
47 C 2018-01-02 P2 7
48 C 2018-01-03 P2 8
49 C 2018-01-04 P2 9
50 C 2018-01-05 P2 10
51 C 2018-01-01 P3 11
52 C 2018-01-02 P3 12
53 C 2018-01-03 P3 13
54 C 2018-01-04 P3 14
55 C 2018-01-05 P3 15
56 C 2018-01-01 P4 16
57 C 2018-01-02 P4 17
58 C 2018-01-03 P4 18
59 C 2018-01-04 P4 19
60 C 2018-01-05 P4 20
答案 0 :(得分:0)
在创建您的df
时,请使用stringsAsFactors = FALSE
,以免影响因素。
df <- data.frame(Comp, Date, Plot,stringsAsFactors=FALSE)
df$z=as.numeric(as.factor(paste(df$Date,df$Plot,sep="#")))
> head(df,25)
Comp Date Plot z
1 A 2018-01-01 P1 1
2 A 2018-01-01 P2 2
3 A 2018-01-01 P3 3
4 A 2018-01-01 P4 4
5 A 2018-01-02 P1 5
6 A 2018-01-02 P2 6
7 A 2018-01-02 P3 7
8 A 2018-01-02 P4 8
9 A 2018-01-03 P1 9
10 A 2018-01-03 P2 10
11 A 2018-01-03 P3 11
12 A 2018-01-03 P4 12
13 A 2018-01-04 P1 13
14 A 2018-01-04 P2 14
15 A 2018-01-04 P3 15
16 A 2018-01-04 P4 16
17 A 2018-01-05 P1 17
18 A 2018-01-05 P2 18
19 A 2018-01-05 P3 19
20 A 2018-01-05 P4 20
21 B 2018-01-01 P1 1
22 B 2018-01-01 P2 2
23 B 2018-01-01 P3 3
24 B 2018-01-01 P4 4
25 B 2018-01-02 P1 5
首先,我们生成一个新变量,该变量将Date
和Plot
列粘贴有随机(越少越好)分隔符(#
)。然后,我们利用as.numeric(as.factor()
组合的优势,该组合首先将新变量分组为factor
,然后为每个level
分配一个数字。
答案 1 :(得分:0)
@Rui Barradas的答案很简单:
df$new <- with(df, ave(as.integer(Comp), Comp, FUN = seq_along))