R 用0和1向量填充数据帧
我有一个带有两列(a和B)的数据帧。列A为分类列,B为数字列(范围从0.0到1.0)。我想创建一个C列,当B列中的值大于或等于0.5时,其值为1;当B列中的值小于0.5时,其值为0。有什么建议吗?最终df应如下所示:R 用0和1向量填充数据帧,r,loops,vector,dataframe,fill,R,Loops,Vector,Dataframe,Fill,我有一个带有两列(a和B)的数据帧。列A为分类列,B为数字列(范围从0.0到1.0)。我想创建一个C列,当B列中的值大于或等于0.5时,其值为1;当B列中的值小于0.5时,其值为0。有什么建议吗?最终df应如下所示: A = c('spA', 'spB', 'spC', 'spD') B = c(0.25, 0.15, 0.50, 0.75) C = c(0,0,1,1) df = data.frame(A, B, C) 只用 A = c('spA', 'spB', 'spC', 'sp
A = c('spA', 'spB', 'spC', 'spD')
B = c(0.25, 0.15, 0.50, 0.75)
C = c(0,0,1,1)
df = data.frame(A, B, C)
只用
A = c('spA', 'spB', 'spC', 'spD')
B = c(0.25, 0.15, 0.50, 0.75)
df = data.frame(A, B)
df$C <- as.numeric(df$B >= 0.5)
A=c('spA'、'spB'、'spC'、'spD')
B=c(0.25,0.15,0.50,0.75)
df=数据帧(A,B)
df$C=0.5)
@David Arenburg:上述三种解决方案的速度比较老实说,我不知道为什么速度会那么快
require(microbenchmark)
microbenchmark(
df$C <- ifelse(df$B>=0.5, 1, 0),
transform(df, C = as.numeric(B >= 0.5)),
df$C <- as.numeric(df$B>=0.5)
)
require(微基准)
微基准(
df$C=0.5,1,0),
变换(df,C=as.numeric(B>=0.5)),
df$C=0.5)
)
结果:
Unit: microseconds
expr min lq median uq max neval
df$C <- ifelse(df$B >= 0.5, 1, 0) 33.585 35.7580 38.1285 41.6845 140.66 100
transform(df, C = as.numeric(B >= 0.5)) 143.821 149.7470 155.0815 164.5640 284.48 100
df$C <- as.numeric(df$B >= 0.5) 20.546 22.9165 24.2995 27.2630 53.34 100
单位:微秒
expr最小lq中值uq最大neval
df$C=0.5,1,0)33.585 35.7580 38.1285 41.6845 140.66 100
变换(df,C=as.numeric(B>=0.5))143.821149.7470155.0815164.5640284.48100
df$C=0.5)20.546 22.9165 24.2995 27.2630 53.34 100
编辑:大型数据集
df <- data.frame(B=runif(100000))
require(microbenchmark)
microbenchmark(
df$C <- ifelse(df$B>=0.5, 1, 0),
transform(df, C = as.numeric(B >= 0.5)),
df$C <- as.numeric(df$B>=0.5)
)
Unit: microseconds
expr min lq median uq max neval
df$C <- ifelse(df$B >= 0.5, 1, 0) 31620.826 33623.452 34529.8380 55652.9290 62707.064 100
transform(df, C = as.numeric(B >= 0.5)) 811.561 979.286 1032.6255 1248.5550 2333.137 100
df$C <- as.numeric(df$B >= 0.5) 606.498 764.542 808.0045 979.0875 23805.112 100
df=0.5],
df$C=0.5)
)
单位:微秒
expr最小lq中值uq最大neval
df$C=0.5,1,0)31620.826 33623.452 34529.8380 55652.9290 62707.064 100
转换(df,C=as.numeric(B>=0.5))811.561979.2861032.62551248.55502333.137100
df$C=0.5)606.498764.542808.0045979.087523805.112100
看一看?ifelse
尽量避免ifelse
。只要做变换(df,C=as.numeric(B>=0.5))
或者更快df$C=0.5)
@Floo0,它有多快?@jbaums我认为它很慢,因为它需要计算整个向量。TBH,我不知道到底是什么让它这么慢,但我肯定它非常慢。所以,我一直在努力避免它。你们是在4行数据集上进行基准测试吗?我两者都做了。刚刚添加了100000行数据集的结果。结果是一样的。对于大小数据集,$
比转换更快。值得注意的是,分位数没有重叠。所以它明显更快…实际上,$
的方差是巨大的,最大值更高了10倍,所以它实际上并不快。你只是碰巧变得更好了,更别提“你的”解决方案和我的没有什么不同。我没有使用$
的原因是为了避免两次复制整个数据集,可能我错了,但我的解释更多地基于分位数,而不是极值。由于$
的uq低于转换的lq,我的解释是在大多数情况下$
更快。在$
糟糕的地方可能有25%,在转换
快得多的地方也可能有25%。但我个人会支持“多数”——投票。。。