如果有人介意提供一些知识......我正在尝试做的是根据以下数据框值制作一个新的数据框。
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/