我有一个包含大量数据的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)))
}
但我无法调整此代码以用于处理我的数据。有人可以帮忙吗?
答案 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)