我想生成一个列子集之间差异平均值的列.假设我有以下数据集:

set.seed(123)
df <- data.frame( y = runif(1:10),
                  x1 = runif(1:10),
                  x2 = runif(1:10),
                  x3 = runif(1:10))
df[, "x1"][ df[, "x1"] < 0.5 ] <- NA
df[, "x3"][ df[, "x3"] > 0.7 ] <- NA

df
           y        x1        x2         x3
1  0.2875775 0.9568333 0.8895393         NA
2  0.7883051        NA 0.6928034         NA
3  0.4089769 0.6775706 0.6405068 0.69070528
4  0.8830174 0.5726334 0.9942698         NA
5  0.9404673        NA 0.6557058 0.02461368
6  0.0455565 0.8998250 0.7085305 0.47779597
7  0.5281055        NA 0.5440660         NA
8  0.8924190        NA 0.5941420 0.21640794
9  0.5514350        NA 0.2891597 0.31818101
10 0.4566147 0.9545036 0.1471136 0.23162579

因此,在本例中,我希望得到((x1-y)+(x2-y)+(x3-y))/(X的个数).由于缺少值,这会变得有点复杂,并不是所有的行都会得到相同的计算. 例如,第1行的值将计算((x1-y)+(x2-y))/2,而第7行应该只计算(x2-y)/1,因为只有一个值.我怎样才能读到这个专栏?如果你需要更多的澄清,请告诉我.

推荐答案

你可以用宽格式的rowMeans来做这件事,以解决NA个问题:

rowMeans(df[c("x1","x2","x3")] - df[["y"]], na.rm=TRUE)

但最终,我认为这种x1/2/3种数据最好是没有NA的长格式,这样您就可以使用类似于group_by的逻辑来进行任何计算,而不必担心排除行.类似于:

na.omit(cbind(rowid = seq_len(nrow(df)), stack(df[-1])))
#   rowid     values ind
#1      1 0.95683335  x1
#3      3 0.67757064  x1
#4      4 0.57263340  x1
#6      6 0.89982497  x1
#10    10 0.95450365  x1
#11     1 0.88953932  x2
#12     2 0.69280341  x2
# ...

R相关问答推荐

带有gplot 2的十字舱口

在R底座中更改白天和夜晚的背景 colored颜色

如何得到R中唯一的组合群?

使用外部文件分配变量名及其值

基于Key->Value数据帧的基因子集相关性提取

如何使用同比折线图中的个别日

提高圣彼得堡模拟的速度

如何对r中包含特定(未知)文本的行求和?

'使用`purrr::pwalk`从嵌套的嵌套框架中的列表列保存ggplots时出现未使用的参数错误

有没有办法一次粘贴所有列

解析嵌套程度极高的地理数据

有没有办法将不等长的列表转换为R中的数据帧

数值型数据与字符混合时如何进行绑定

向R中的数据帧添加一列,该列统计另一列中每个唯一值的二进制观测值的数量

根据r中每行中的日期序列,使用列名序列创建新列

如何使用循环从R中的聚合函数创建列,而不会在名称中给出&q;$&q;?

如何在访问之前下载的输入时同时上传和处理所有指定的shiny 输入?

在分面的ggplot2条形图中对条形图进行排序,并省略每组未使用的系数级别

对数据帧中的大量组合执行Kruskal-Wallis测试

R直方图存储计算的bin值