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

标签 r

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

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/

相关文章:

r - 如何创建循环文件夹并返回表格和绘图的 knitr 报告

r - ggplot stat_* 函数在概念上是如何工作的?

r - 如何将所有子列表元素组合到一个列表中

r - excel函数“R中决策函数的搜索

r - 在bind_rows之后命名数据框中的行

regex - 根据特定条件在 R 中拆分字符串

r - 将图像背景添加到 ggplot barplot 以便图像仅在条形图内可见

C变量赋值和R等效

R - 用于多个不同大小重采样的任何函数

R - 将每行中变量的前两次更改为 NA