Suppose I have the following DF:

C1 C2
0 0
1 1
1 1
0 0
. .
. .

I now want to apply these following conditions on the Dataframe:

  • C1的值应为1
  • 0到5之间的随机整数应小于2

如果这两个条件都为真,我将该行的C1和C2值更改为2

我知道这可以通过使用apply函数来实现,我使用了以下方法:

C1 <- c(0, 1,1,0,1,0,1,0,1,0,1)
C2 <- c(0, 1,1,0,1,0,1,0,1,0,1)

df <- data.frame(C1, C2)

fun <- function(x){
  if (sample(0:5, 1) < 2){
    x[1:2] <- 2
  }
  return (x)
}

index <- df$C1 ==1  // First Condition
processed_Df <-t(apply(df[index,],1,fun)) // Applies Second Condition
df[index,] <-  processed_Df

Output:

C1 C2
0 0
2 2
1 1
0 0
. .
. .

有些行同时满足这两个条件,有些行则不满足(这是主要条件)

现在我想用矢量化实现同样的效果,而不使用循环或apply函数.我唯一的困惑是"如果我不使用apply,那么根据条件的结果,每一行不是都会得到相同的结果吗?(例如,下面:)

df$C1 <- ifelse(df$C1==1 & sample(0:5, 1) < 5, 2, df$C1)

这会将我的DF中C1==2的所有行更改为2,而此时可能会有许多1.

有没有一种方法可以在不使用apply函数的情况下为每行的第二个条件获得不同的结果?希望我的问题有道理.

谢谢

推荐答案

你需要将sample个值重复nrow次.试试这个方法-

set.seed(167814)
df[df$C1 == 1 & sample(0:5, nrow(df), replace = TRUE) < 2, ] <- 2
df

#   C1 C2
#1   0  0
#2   2  2
#3   2  2
#4   0  0
#5   1  1
#6   0  0
#7   2  2
#8   0  0
#9   1  1
#10  0  0
#11  1  1

R相关问答推荐

使用lapply的重新定位功能

对lme 4对象运行summary()时出错(diag中的错误(from,names = RST):对象unpackedMatrix_diag_get找不到)

用黄土法确定区间

如何将dygraph调用到R Markdown作为一个shiny 的react 对象的参数?

R s iml包如何处理语法上无效的因子级别?'

如何在ggplot中标记qqplot上的点?

制作等距离的线串副本

如何编辑gMarginal背景以匹配绘图背景?

根据列A中的差异变异列,其中行由列B中的相对值标识

R spatstat Minkowski Sum()返回多个边界

从多面条形图中删除可变部分

按列中显示的配对组估算NA值

R中Gamma回归模型均方误差的两种计算方法不一致

减go R中列表的所有唯一元素对

如何在条形图中的x和填充变量中包含多个响应变量?

禁用时,SelecizeInput将变得不透明

根据向量对列表元素进行排序

打印的.txt文件,将值显示为&Quot;Num&Quot;而不是值

GgHighlight找不到它创建的列:`Highlight..1`->;`Highlight.....`

按顺序将地块添加到列表