gpt4 book ai didi

r - 如何以依赖于 R 中其他行和列中的值的方式填充数据框

转载 作者:行者123 更新时间:2023-12-02 00:02:05 24 4
gpt4 key购买 nike

假设我有一个如下所示的数据框:

ID   T  X  Y  Z
1 1 A A NA
1 2 B A NA
1 3 B B NA
1 4 B A NA
2 1 A B NA
2 2 A A NA
2 3 B A NA
2 4 A B NA
3 1 B B NA
3 2 B B NA
3 3 B B NA
3 4 B A NA

我想根据一些依赖于行和(前)列值的条件来替换 Z 的值,以便上面的结果看起来像这样:

ID   T  X  Y  Z
1 1 A A 0
1 2 B A 0
1 3 B B 1
1 4 B A NA
2 1 A B 0
2 2 A A 0
2 3 B A 0
2 4 A B 0
3 1 B B 1
3 2 B B NA
3 3 B B NA
3 4 B A NA

规则:

  1. Z 第一次取值 1(按 T 排序,并且在一个 ID 内)该行的 X 和 Y 都具有值 B。
  2. Z 取(或保留)值 NA 当且仅当对于任何更小的 T 值,它已经取值 1。
  3. 当 T = 1 时,如果该行上的 X 和 Y 不均等于 B,则 Z 取值 0。
  4. 当 T > 1 时,如果该行上的 X 和 Y 不都等于 B,并且上一行上的 Z 值 = 零,则 Z 取值 0。

我想让下面的东西起作用,它让我有点接近但没有骰子:

df$Z <- NA
for (t in 1:4) {
df$Z[ (df$X=="B" & df$Y=="B") & df$T==1] <- 1
df$Z[!(df$X=="B" & df$Y=="B") & df$T==1] <- 0
if (t>1) {
df$Z[ (df$X=="B" & df$Y=="B") & df$T==t & (!is.na(df$Z[t-1]) & df$Z[t-1]==0)] <- 0
df$Z[!(df$X=="B" & df$Y=="B") & df$T==t & (!is.na(df$Z[t-1]) & df$Z[t-1]==0)] <- 1
}
}

另一方面,我可以编写一系列嵌套的 if...then 语句循环遍历所有观察结果,但这非常慢(至少,与我正在从 Stata 上翻译的程序)。

我确信我在上面的尝试中犯了十二种错误,但几个小时的努力并没有解决它。

所以我来找你乞讨,手里拿着帽子。 :)

编辑:我突然想到共享 Stata 代码(解决这个问题所以比我在 R 中想出的要快得多,这很讽刺,因为我更喜欢 R 而不是 Stata 的语言 :) 可能有助于提出建议。这是我想要的,而且速度很快(即使 N=1600,T=11):

replace Z = .
forvalues t = 1(1)4 {
replace Z = 1 if X == "B" & Y == "B" & T == 1
replace Z = 0 if X == "B" & Y == "B" & T == 1
replace Z = 1 if X == "B" & Y == "B" & T == `t' & Z[_n-1] == 0 & `t' > 1
replace Z = 0 if X == "B" & Y == "B" & T == `t' & Z[_n-1] == 0 & `t' > 1
}

最佳答案

这是使用 avetransform 的一种方法:

transform(dat[order(dat$ID, dat$T), ],
Z = ave(X == "B" & Y == "B", ID, FUN = function(x) {
as.integer("is.na<-"(x, (duplicated(x) & cumsum(x)) |
c(0, diff(x)) < 0)) }))

# ID T X Y Z
# 1 1 1 A A 0
# 2 1 2 B A 0
# 3 1 3 B B 1
# 4 1 4 B A NA
# 5 2 1 A B 0
# 6 2 2 A A 0
# 7 2 3 B A 0
# 8 2 4 A B 0
# 9 3 1 B B 1
# 10 3 2 B B NA
# 11 3 3 B B NA
# 12 3 4 B A NA

其中 dat 是数据框的名称。如果行已经按照 IDT dat[order(dat$ID, dat$T), ]).

关于r - 如何以依赖于 R 中其他行和列中的值的方式填充数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20768914/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com