【问题标题】:Creating new columns in R data set within function在函数内的 R 数据集中创建新列
【发布时间】:2016-08-05 22:43:41
【问题描述】:

我有一个我正在学习的课程的数据集,它来自 UCI 机器学习存储库。我必须按日期对其进行子集化,然后按日期和时间绘制各种测量值。为了准备数据集,我使用以下代码:

prep <- function(x) {
  setwd("/Users/johnlynch/Google Drive/DataToolbox/Exploring/Week 1")
  power <- read.csv("poweruse.txt", sep = ";", stringsAsFactors = FALSE)
  power$Date <- strptime(power$Date, "%d/%m/%Y")
  power <- subset(power, Date == "2007-02-01"|Date == "2007-02-02")
}

然后,当我在控制台中运行我的脚本时,我输入“power

头(我的数据)

日期时间 Global_active_power Global_reactive_power 电压 Global_intensity Sub_metering_1 Sub_metering_2 Sub_metering_3

66637 2007-02-01 00:00:00 0.326 0.128 243.150 1.400 0.000 66637 0.000 0

66638 2007-02-01 00:01:00 0.326 0.130 243.320 1.400 0.000 66638 0.000 0

66639 2007-02-01 00:02:00 0.324 0.132 243.510 1.400 0.000 66639 0.000 0

66640 2007-02-01 00:03:00 0.324 0.134 243.900 1.400 0.000 66640 0.000 0

66641 2007-02-01 00:04:00 0.322 0.130 243.160 1.400 0.000 66641 0.000 0

66642 2007-02-01 00:05:00 0.320 0.126 242.290 1.400 0.000 66642 0.000 0

但是,我在绘制绘图时发现,为了匹配课程图,我需要通过将日期和时间列合并为一个,在数据框中创建一个新列 $newdate。所以我尝试将我的脚本调整如下:

prep <- function(x) {
  setwd("/Users/johnlynch/Google Drive/DataToolbox/Exploring/Week 1")
  power <- read.csv("poweruse.txt", sep = ";", stringsAsFactors = FALSE)
  power$Date <- strptime(power$Date, "%d/%m/%Y")
  power <- subset(power, Date == "2007-02-01"|Date == "2007-02-02")
  power$newDate <- with(power, paste(Date, Time))
}

我想,嘿,这应该在数据框中创建一个新列,该列将与其余数据一起输出到 mydata 变量中。但是,当我运行该函数时,我得到的唯一输出是 $newdate 列的内容:

头(我的数据)

[1] "2007-02-01 00:00:00" "2007-02-01 00:01:00" "2007-02-01 00:02:00" "2007-02-01 00: 03:00"

[5] "2007-02-01 00:04:00" "2007-02-01 00:05:00"

我做错了什么?为什么第二个脚本不输出整个数据集,最后添加了一个新列?有人可以告诉我如何纠正吗?

【问题讨论】:

  • return(power)(或只是power)添加到函数的最后一行。
  • 威煌说得对。函数只返回最后一行代码中的对象。在您的情况下,它只是创建一个列。

标签: r date datetime dataframe


【解决方案1】:

R 中的函数返回最后一个被计算的表达式。考虑这两个函数:

f1 <- function(x) {
  x$a <- 2
  x
}

f2 <- function(x) {
  x$a <- 2
}

给定一个列表,f1 将返回一个列表,而 f2 将返回一个长度为 1(数字 2)的数字向量:

> x <- list(a = 1)
> str(f1(x))
List of 1
 $ a: num 2
> str(f2(x))
 num 2
> 

更多详情,Hadley Wickham 的tutorial on functions 值得一读。

【讨论】:

  • 这完全解决了它!感谢您解释得如此清楚,我会阅读 Wickham 的教程。
【解决方案2】:

在R函数中,如果不使用return,R会默认返回最后一行代码。 所以永远不要忘记为你想要的结果添加回报。

prep <- function(x) {
  setwd("/Users/johnlynch/Google Drive/DataToolbox/Exploring/Week 1")
  power <- read.csv("poweruse.txt", sep = ";", stringsAsFactors = FALSE)
  power$Date <- strptime(power$Date, "%d/%m/%Y")
  power <- subset(power, Date == "2007-02-01"|Date == "2007-02-02")
  power$newDate <- with(power, paste(Date, Time))
  return(power)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    相关资源
    最近更新 更多