【问题标题】:How to create new columns in R every time a given value appears?每次出现给定值时如何在 R 中创建新列?
【发布时间】:2018-10-31 09:25:10
【问题描述】:

如果某个值出现在现有行中,我有一个关于创建新列的问题。

N=5
T=5
time<-rep(1:T, times=N)
id<- rep(1:N,each=T)
dummy<- c(0,0,1,1,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0)
df <- data.frame(id, time, dummy)

   id time dummy
1   1    1     0
2   1    2     0
3   1    3     1
4   1    4     1
5   1    5     0
6   2    1     0
7   2    2     0
8   2    3     1
9   2    4     0
10  2    5     0
11  3    1     0
12  3    2     1
13  3    3     0
14  3    4     1
15  3    5     0
16  4    1     0
17  4    2     0
18  4    3     0
19  4    4     0
20  4    5     0
21  5    1     1
22  5    2     0
23  5    3     0
24  5    4     1
25  5    5     0

在这种情况下,我们有一些横截面中出现了多个 1。现在我尝试为每个额外的 1 创建一个新的虚拟变量/列。之后,对于每个虚拟,每个横截面的行也应该在第一个 1 出现后用 1 填充。我可以通过在每一列上使用 group_by(id) 和 cummax 函数来填充行。但是如何在不手动遍历每个横截面的情况下获得新变量?所以我想实现以下目标:

   id time dummy dummy2
1   1    1     0      0
2   1    2     0      0
3   1    3     1      0
4   1    4     1      1
5   1    5     1      1
6   2    1     0      0
7   2    2     0      0
8   2    3     1      0
9   2    4     1      0
10  2    5     1      0
11  3    1     0      0
12  3    2     1      0
13  3    3     1      0
14  3    4     1      1
15  3    5     1      1
16  4    1     0      0
17  4    2     0      0
18  4    3     0      0
19  4    4     0      0
20  4    5     0      0
21  5    1     1      0
22  5    2     1      0
23  5    3     1      0
24  5    4     1      1
25  5    5     1      1

谢谢! :)

【问题讨论】:

  • as.data.frame(cbind(.)) 太糟糕了!我会编辑的。
  • 不明白你的意思。为什么每个数据帧中的dummy 不同?不清楚。

标签: r


【解决方案1】:

你可以使用cummax,你需要cumsum来创建dummy2

df %>% 
  group_by(id) %>% 
  mutate(dummy1 = cummax(dummy), # don't alter 'dummy' here we need it in the next line
         dummy2 = cummax(cumsum(dummy) == 2)) %>% 
  as.data.frame() # needed only to display the entire result
#   id time dummy dummy1 dummy2
#1   1    1     0      0      0
#2   1    2     0      0      0
#3   1    3     1      1      0
#4   1    4     1      1      1
#5   1    5     0      1      1
#6   2    1     0      0      0
#7   2    2     0      0      0
#8   2    3     1      1      0
#9   2    4     0      1      0
#10  2    5     0      1      0
#11  3    1     0      0      0
#12  3    2     1      1      0
#13  3    3     0      1      0
#14  3    4     1      1      1
#15  3    5     0      1      1
#16  4    1     0      0      0
#17  4    2     0      0      0
#18  4    3     0      0      0
#19  4    4     0      0      0
#20  4    5     0      0      0
#21  5    1     1      1      0
#22  5    2     0      1      0
#23  5    3     0      1      0
#24  5    4     1      1      1
#25  5    5     0      1      1

【讨论】:

  • 再次感谢! :) 这正是我想要的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 2020-11-29
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
相关资源
最近更新 更多