如何根据其他两个条件生成变量

时间:2019-03-13 11:38:37

标签: r dataframe

我有一个巨大的数据框,需要基于其他三个值添加一个新变量。 新变量必须是数字变量,并取决于变量“隔间”,“图解”和“日期”。在每个隔间中,我将为图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

2 个答案:

答案 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

首先,我们生成一个新变量,该变量将DatePlot列粘贴有随机(越少越好)分隔符(#)。然后,我们利用as.numeric(as.factor()组合的优势,该组合首先将新变量分组为factor,然后为每个level分配一个数字。

答案 1 :(得分:0)

@Rui Barradas的答案很简单:

df$new <- with(df, ave(as.integer(Comp), Comp, FUN = seq_along))