我正在努力想出一个函数来执行以下操作data.frame
输出一个名称相同的新data.frame
:
1 - 创建seq(min(target), max(target), .1)
。
2 - 采用所有其他变量的均值。
例如,如果q
是我们的data.frame
,而jen
是target
,我想重新格式化q
,jen
数据变为seq(min(jen), max(jen), .1)
,bob
和joe
只会更改为平均值。
是否可以在R?
中执行此操作我尝试了一些东西,但它远非准确。
q = data.frame(bob = 1:5 - 3, jen = c(1.7, 2.6, 2.5, 4.4, 3.8) - 3, joe = 5:9)
change <- function(dataframe = q, target = "jen"){
n <- names(dataframe)
dataframe[target] <- seq(from = min(target), max(target), .1)
}
答案 0 :(得分:2)
基础R解决方案。我的想法是先在函数中创建目标列,然后使用for循环添加其他列的平均值。
# Example data frame
q <- data.frame(bob = 1:5 - 3, jen = c(1.7, 2.6, 2.5, 4.4, 3.8) - 3, joe = 5:9)
# Create then function
change <- function(dat, target){
vec <- dat[, target]
target_new <- seq(min(vec), max(vec), by = 0.1)
dat2 <- data.frame(target_new)
names(dat2) <- target
for (i in names(dat)[!names(dat) %in% target]){
dat2[[i]] <- mean(dat[[i]])
}
dat2 <- dat2[, names(dat)]
return(dat2)
}
# Apply the function
change(q, "jen")
# bob jen joe
# 1 0 -1.3 7
# 2 0 -1.2 7
# 3 0 -1.1 7
# 4 0 -1.0 7
# 5 0 -0.9 7
# 6 0 -0.8 7
# 7 0 -0.7 7
# 8 0 -0.6 7
# 9 0 -0.5 7
# 10 0 -0.4 7
# 11 0 -0.3 7
# 12 0 -0.2 7
# 13 0 -0.1 7
# 14 0 0.0 7
# 15 0 0.1 7
# 16 0 0.2 7
# 17 0 0.3 7
# 18 0 0.4 7
# 19 0 0.5 7
# 20 0 0.6 7
# 21 0 0.7 7
# 22 0 0.8 7
# 23 0 0.9 7
# 24 0 1.0 7
# 25 0 1.1 7
# 26 0 1.2 7
# 27 0 1.3 7
# 28 0 1.4 7
答案 1 :(得分:2)
以下是base R
data.frame(Map(function(x, y) if(x=="mean") get(x)(y) else
get(x)(min(y), max(y), by = 0.1), setNames(c("mean", "seq", "mean"), names(q)), q))
或dplyr
library(dplyr)
q %>%
summarise(bob = mean(bob),
jen = list(seq(min(jen), max(jen), by = 0.1)),
joe = mean(joe)) %>%
unnest
或者,如果有很多列要获取mean
且只有一个列序列,那么而不是逐个指定
q %>%
mutate_at(c(1,3), mean) %>%
group_by(bob, joe) %>%
summarise(jen = list(seq(min(jen), max(jen), by = 0.1))) %>%
unnest
或使用complete
q %>%
group_by(bob = mean(bob), joe = mean(joe)) %>%
complete(jen = seq(min(jen), max(jen), by = .1))
答案 2 :(得分:1)
我的解决方案使用colMeans函数,并在序列很长时间内重复结果。然后我用序列结果替换目标列。
q = data.frame(bob = 1:5 - 3, jen = c(1.7, 2.6, 2.5, 4.4, 3.8) - 3, joe = 5:9)
manip <- function(target, df){
t.column <- which(colnames(df) == target)
dfmeans <- colMeans(df)
minmax <- range(df[,t.column],na.rm = T)
t.seq <- seq(minmax[1],minmax[2],.1)
newdf <- matrix(dfmeans, ncol = length(dfmeans))[rep(1, length(t.seq)),]
newdf[,t.column] <- t.seq
colnames(newdf) <- colnames(df)
return(as.data.frame(newdf))
}
manip("jen",q)