Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 用0和1向量填充数据帧_R_Loops_Vector_Dataframe_Fill - Fatal编程技术网

R 用0和1向量填充数据帧

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和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', '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%。但我个人会支持“多数”——投票。。。