我有一个包含整数的数据框,如下所示:

# generate data frame
df = cbind(c(0,102,0,40,0,0), c(22,0,0,0,12,4), c(23,101,55,0,0,0),
           c(0,0,0,414,0,0), c(0,0,61,0,0,112), c(0,0,0,0,20,0))
colnames(df) = c('A', 'T', 'C', 'G', 'N', 'Del')
rownames(df) = c('Pos1', 'Pos2', 'Pos3', 'Pos4', 'Pos5', 'Pos6')
df
           A  T   C   G   N Del
    Pos1   0 22  23   0   0   0
    Pos2 102  0 101   0   0   0
    Pos3   0  0  55   0  61   0
    Pos4  40  0   0 414   0   0
    Pos5   0 12   0   0   0  20
    Pos6   0  4   0   0 112   0

我还有一个包含整数的向量(对应于df的列索引):

# generate vector
cols = c(2,3,5,4,6,5)

现在,我想将df中的所有整数重置为零,这些整数存在于列中,列索引列在向量row-by-row中.例如,对于第一行,我希望将列2重置为零,对于第二行,我希望将列3重置为零,依此类推.

我用下面这段代码解决了这个问题:

for (i in c(1:nrow(df))) {
    ncol = cols[[i]]
    df[[i, ncol]] = 0
    df
}
df
   
    A  T  C G N Del
    Pos1   0  0 23 0 0   0
    Pos2 102  0  0 0 0   0
    Pos3   0  0 55 0 0   0
    Pos4  40  0  0 0 0   0
    Pos5   0 12  0 0 0   0
    Pos6   0  4  0 0 0   0

如您所见,我的代码按预期运行.然而,事实证明,它在 Big Data 集上的效率非常低.因此,我想知道是否有比使用for循环快得多的替代方法.

Note看起来我是在重置每一行中的最大值,但情况并非如此,在某些情况下,我要重置为零的是两个值中较小的一个.因此,我不能简单地将每行中的最小或最大值重置为零.

推荐答案

您可以使用cbind创建行和列位置的矩阵,并将其替换为0,如下所示.

rows <- seq_len(nrow(df))
df[cbind(rows, cols)] <- 0

结果

df
#       A  T  C G N Del
#Pos1   0  0 23 0 0   0
#Pos2 102  0  0 0 0   0
#Pos3   0  0 55 0 0   0
#Pos4  40  0  0 0 0   0
#Pos5   0 12  0 0 0   0
#Pos6   0  4  0 0 0   0

R相关问答推荐

使用对管道内单元格的引用生成新变量

使用R的序列覆盖

在位置周围设定一个半径并识别该半径内的其他位置

抖动点与嵌套类别变量箱形图的位置不对齐

如何在R中合并和合并多个rabrame?

用黄土法确定区间

我不能在docker中加载sf

如果第一个列表中的元素等于第二个列表的元素,则替换为第三个列表的元素

R中插入符号训练函数的中心因子和尺度因子预测

如何从R ggplot图片中获取SVG字符串?

如何读取CSV的特定列时,给定标题作为向量

迭代到DataFrame列并获得成对的值列表(col1->;col2、col2->;col3、col3->;col4等)的正确方法.

从线的交点创建面

防止正则表达式覆盖以前的语句

数据集上的R循环和存储模型系数

为什么将负值向量提升到分数次方会得到NaN

R:如何在数据集中使用Apply

如何修改GT表中组名行的 colored颜色 ?

在R中使用ggraph包排列和着色圆

使用dplyr删除具有条件的行