gpt4 book ai didi

r - 根据另外两个值更改数据框中的多个值

转载 作者:行者123 更新时间:2023-12-04 14:57:08 25 4
gpt4 key购买 nike

如果有人介意提供一些知识......我正在尝试做的是根据以下数据框值制作一个新的数据框。

id   value
ant 10
cat 4
cat 6
dog 5
dog 3
dog 2
fly 9

接下来我想做的是,我想按顺序制作一个如下所示的数据框。

  • 每次我们看到一个新 ID 时,我们都会创建一个列。最大值为 10,因此应该有 10 行。
  • 我们的第一个词是 Ant ,因此对于每一行 Ant ,我想要一个 0。
  • 我们的下一个专栏是猫。我们有 2 个值,我想做的是对于我们看到的第一个值,前 4 行必须是 0,后面是 6 行 1。
  • 狗的逻辑相同,前五行为 0,后三行为 1,最后 2 行为 0。
  • Fly 只有 9 行 0,最后一行应该包含 NA。

应该是这样的

ant  cat  dog  fly
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 1 0 0
0 1 1 0
0 1 1 0
0 1 1 0
0 1 0 0
0 1 0 NA

我知道如何从长远来看

newdf <- data.frame(matrix(2, ncol = length(unique(df[,"id"])) , nrow = 10))
newdf$X1[1:10] <- 0
newdf$X2[1:4] <- 0
newdf$X2[5:10] <- 1
...

但是,有什么方法可以更有效地做到这一点?请注意,我的实际数据大约有 50 行,因此我正在寻找更有效的方法来完成此操作!

最佳答案

这是一个 tidyverse 答案 -

library(dplyr)
library(tidyr)

df %>%
group_by(id) %>%
mutate(val = rep(c(0, 1), length.out = n())) %>%
uncount(value) %>%
mutate(row = row_number()) %>%
complete(row = 1:10) %>%
pivot_wider(names_from = id, values_from = val) %>%
select(-row)

# ant cat dog fly
# <dbl> <dbl> <dbl> <dbl>
# 1 0 0 0 0
# 2 0 0 0 0
# 3 0 0 0 0
# 4 0 0 0 0
# 5 0 1 0 0
# 6 0 1 1 0
# 7 0 1 1 0
# 8 0 1 1 0
# 9 0 1 0 0
#10 0 1 0 NA

对于每个 id,我们分配一个交替的 0、1 值,并使用 uncount 根据计数重复行。获取宽格式的数据,以便我们为每个 id 设置一个单独的列。

数据

df <- structure(list(id = c("ant", "cat", "cat", "dog", "dog", "dog", 
"fly"), value = c(10, 4, 6, 5, 3, 2, 9)), row.names = c(NA, -7L
), class = "data.frame")

关于r - 根据另外两个值更改数据框中的多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67716615/

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