【问题标题】:Applying a function to a single R data.frame column: lapply and apply not working - looking for R equivalent to Python's DataFrame.apply(...)将函数应用于单个 R data.frame 列:lapply 和 apply 不起作用 - 寻找与 Python 的 DataFrame.apply(...) 等效的 R
【发布时间】:2019-06-14 23:25:33
【问题描述】:

这里是 Python 编码器,但我需要在 R 中处理一些带有附加数据的 shapefile,我需要通过将一个简单的函数应用于具有日期时间数据的列,将其从当前格式转换为常规日期时间。这在 Python 中很简单,但是在 R 中使用 apply 和 lapply 时,我总是遇到奇怪的错误(详见下文)。答案可能相对简单,因为我对 R 的熟悉程度远低于 Python,因此非常感谢任何帮助。

R 版本

# df is an R data.frame with 54 columns. The only one relevant for this
# question is df["ISSUE_DATE"], which is currently a list of 13-digit 
# integers. I need to convert it to a regular datetime.

df$ISSUE_DATE[0:5]
[1] 20011001000000 20030228000000 19990910000000 20131108000000
[5] 19970930000000

fix_date = function(x){
  string_x = toString(x)
  datestr = substr(string_x, 0, 8)
  result = as.Date(datestr, "%Y%m%d")
  return(result)
}

df$fixed_dates = lapply(df$ISSUE_DATE, fix_date)

# This returns a column with the same value - fix_date(df$ISSUE_DATE[1])
# - in every row:
df$fixed_dates[0:5]
[1] "2001-10-01" "2001-10-01" "2001-10-01" "2001-10-01"
[5] "2001-10-01"

# What I want instead is the result of fix_date applied to each value in 
# df$ISSUE_DATE as the values of df$fixed_dates:
df$fixed_dates[0:5]
[1] "2001-10-01" "2003-02-28" "1999-09-10" "2013-11-08"
[5] "1997-09-30"

这在 Python 中会是什么样子:

df["fixed_dates"] = df["ISSUE_DATE"].apply(fix_date)

【问题讨论】:

    标签: python r dataframe apply lapply


    【解决方案1】:

    区分以下内容:

    • df["colname"]是一列数据框,即“colname”
    • df$colname 是一个向量,其中包含“colname”数据框列的内容

    所以你想要做任何一个

    df$FIXED_DATE <- fix_date(df$ISSUE_DATE)
    

    df$FIXED_DATE <- lapply(df["ISSUE_DATE"], fix_date)
    

    前者是惯用的做法。

    【讨论】:

    • 在他的“R 版本”部分中,您会注意到 OP 实际上确实尝试使用 df$ISSUE_DATE 进行应用,所以我认为他不会对向量的工作原理感到困惑。
    • @SweepingsDemon OP 将此与 Pandas apply 进行比较,默认情况下跨列应用。 lapply,当给定一个向量时,也恰好产生一个结果,这只是一个巧合。
    • 谢谢!不幸的是,这些建议都不起作用。第一个返回[1] "2001-10-01" NA NA NA [5] NA...(第一个日期后跟所有空值),第二个返回[1] "2001-10-01" "2001-10-01" "2001-10-01" "2001-10-01" [5] "2001-10-01"(第一个日期重复到数据框列中的每个值中)。我正在寻找的是将当前df["ISSUE_DATE"] 列中的每个整数转换为我指定格式的日期。
    【解决方案2】:

    您无需编写函数即可将字符串转换为日期。以下是您正在寻找的代码。顺便说一句,ymd 来自lubridate

    Input
    df <- c("20011001000000","20030228000000", "19990910000000", "20131108000000", "19970930000000")
    df <- ymd(as.POSIXct(df,format="%Y%m%d%H%M%OS"))
    
    Output:
    "2001-10-01" "2003-02-28" "1999-09-10" "2013-11-08" "1997-09-30"
    

    【讨论】:

    • 非常感谢!这有效(即使我从整数而不是字符串开始)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 2020-08-10
    • 2016-03-27
    • 2012-05-25
    • 1970-01-01
    相关资源
    最近更新 更多