一个操作R中的data.frames的函数

时间:2018-03-18 02:52:19

标签: r function dataframe

我正在努力想出一个函数来执行以下操作data.frame输出一个名称相同的新data.frame

1 - 创建seq(min(target), max(target), .1)

2 - 采用所有其他变量的均值。

例如,如果q是我们的data.frame,而jentarget,我想重新格式化qjen数据变为seq(min(jen), max(jen), .1)bobjoe只会更改为平均值。

是否可以在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)

 }

3 个答案:

答案 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)