我正在try 构建一个测量跟踪器表单.我想根据各行的Quantity值将0填充到每行的"Measures"列中.(对于数量=2,前2个测量值=0,行的其余部分=NA).(对于数量=4,所有测量值=0).

我想知道如何改变这些行,并在正确索引的位置用适当数量的0替换,如下所示:

 Feature Tool MIN MAX Quantity Measurement_1 Measurement_2 Measurement_3 Measurement_4
1       a    m 0.5 1.0        2             0             0            NA            NA
2       b    n 0.4 1.2        4             0             0             0             0

生成数据帧的示例代码如下所示:

#sample data
A1 <- data.frame(Feature = c("a","b"), Tool = c("m","n"), MIN = c(0.5,0.4), MAX = c(1.0,1.2), Quantity = c(2,4))  

# Create empty data frame of NA
df <- data.frame(matrix(NA,    
                          nrow = 1,
                          ncol = max(A1$Quantity)))

#create list of sequential measurements based on maximum quantity of measurements
M <- c(sprintf("Measurement_%01d", seq(1,max(A1$Quantity)))) 

#set column names to these measurements
colnames(df) <- M  

#combine sample data with measurements
new_dat <- cbind(A1, df)  

我第一次try 做到这一点是这样的:

new_dat %>% rowwise() %>% mutate(new_dat[,6:new_dat$Quantity] <- 0)

但很明显我漏掉了一些东西.

谢谢!

推荐答案

base R中,一种矢量化的方法是使用row/column索引.创建一个复制了行索引和每行列索引的矩阵,然后执行赋值

j1 <- grep("Measurement", names(new_dat))
new_dat[cbind(rep(seq_len(nrow(new_dat)), new_dat$Quantity),
         j1[sequence(new_dat$Quantity)])] <- 0

-输出

> new_dat
  Feature Tool MIN MAX Quantity Measurement_1 Measurement_2 Measurement_3 Measurement_4
1       a    m 0.5 1.0        2             0             0            NA            NA
2       b    n 0.4 1.2        4             0             0             0             0

或者有dplyr个,我们可以做

library(dplyr)
new_dat %>% 
  mutate(across(starts_with("Measurement"),
    ~ replace(.x, readr::parse_number(cur_column()) <= Quantity, 0)))

-输出

  Feature Tool MIN MAX Quantity Measurement_1 Measurement_2 Measurement_3 Measurement_4
1       a    m 0.5 1.0        2             0             0            NA            NA
2       b    n 0.4 1.2        4             0             0             0             0

R相关问答推荐

根据收件箱中的特定值提取列名

为什么观察不会被无功值变化触发?

我不能在docker中加载sf

将嵌套列表子集化为嵌套列表

错误:非常长的R行中出现意外符号

当我们有多个特殊字符时,使用gsub删除名称和代码'

在另存为PNG之前隐藏htmlwidget绘图元素

从BRM预测价值

根据现有列的名称和字符串的存在进行变异以创建多个新列

在保留列表元素属性的同时替换列表元素

悬崖三角洲超大型群数计算导致整数溢出

基于数据集属性将科分配给物种

如何构建一个for循环来循环处理动物ID?

创建新列,其中S列的值取决于该行S值是否与其他行冗余

替换在以前工作的代码中有x行&q;错误(geom_sf/gganimate/dow_mark)

我怎么才能把一盘棋变成一盘棋呢?

使用卡环从R中的列中删除单位(&C)

如何在类应用函数中访问函数本身

Gggvenn为Venn增加了不存在的价值

移除y轴断开的geom_bar图的外框