减去行意味着具有数字数据的列

时间:2018-03-31 23:33:15

标签: r row mean

我有一个包含大量数据的csv文件,例如

> data <- read.csv("data2006.csv", header = TRUE, sep = ";")
> data
      cntry      aa      ab      ac      ad 
1        AT       3       4       3       2 
2        AT       1       2       3       2   
3        AT       2       3       3       4 

我想贬低这些数据,即从后续原始数据的所有元素中减去每行的平均值。我需要对包含在具有数值的列中的元素执行此操作,即列&#39; aa&#39;,&#39; ab&#39;&#39; ac&#39;和&#39; ad&#39;,同时保留列中的元素&#39; cntry&#39;。所以,期望的结果如下:

      cntry      aa      ab      ac      ad 
1        AT       0       1       0      -1 
2        AT      -1       0       1       0   
3        AT      -1       0       0       1

在关于平均居中(http://www.gastonsanchez.com/visually-enforced/how-to/2014/01/15/Center-data-in-R/)的文章中,我发现可以使用rowMeans:

center_rowmeans <- function(x) {
xcenter = rowMeans(x)
x - rep(xcenter, rep.int(nrow(x), ncol(x)))
} 

但我无法调整此代码以用于处理我的数据。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

您真正缺少的是如何识别具有该标识的列和索引的类:

anatasia <- read.table(text="      cntry      aa      ab      ac      ad 
1        AT       3       4       3       2 
                       2        AT       1       2       3       2   
                       3        AT       2       3       3       4 ")


rmeans <- rowMeans(anatasia[,sapply(anatasia, class) %in% c("numeric", "integer")])

dat  <- cbind(anatasia[,!sapply(anatasia, class) %in% c("numeric", "integer")],
              anatasia[, sapply(anatasia, class) %in% c("numeric", "integer")]-rmeans)

colnames(dat) <- colnames(anatasia)
dat
  cntry aa ab ac ad
1    AT  0  1  0 -1
2    AT -1  0  1  0
3    AT -1  0  0  1

答案 1 :(得分:2)

numcols <- sapply(df,is.numeric)
df[numcols] <- df[numcols] - rowMeans(df[numcols])
#   cntry aa ab ac ad
# 1    AT  0  1  0 -1
# 2    AT -1  0  1  0
# 3    AT -1  0  0  1

数据

df <- read.table(text="cntry      aa      ab      ac      ad 
AT       3       4       3       2 
AT       1       2       3       2   
AT       2       3       3       4",strin=F,h=T)

答案 2 :(得分:1)

所以你已经为变量center_rowmeans分配了一个函数。这意味着您现在可以在数据框上调用apply或lapply来返回所需的输出。

使用purrr:

data %>% map(center_rowmeans) 

基地R:

data[2:5] <- lapply(data[2:5], center_rowmeans)