Применение функции к одному столбцу R data.frame: lapply и apply не работает - поиск R эквивалентен Python DataFrame.apply (...) - PullRequest
0 голосов
/ 15 июня 2019

Python-кодер здесь, но у меня есть некоторые шейп-файлы, которые мне нужно обработать в R с прикрепленными данными, которые мне нужно преобразовать из его текущего формата в обычные даты и времени, применяя простую функцию к столбцу с данными datetime.Это легко сделать в Python, но я продолжаю получать странные ошибки при использовании apply и lapply в R (подробности см. Ниже).Вероятно, ответ относительно прост, поскольку я гораздо менее знаком с 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)

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Различают следующее:

  • df["colname"] - это фрейм данных с одним столбцом, а именно "colname"
  • df$colname - это вектор удерживая содержимое столбца фрейма данных «colname»

Итак, вы хотите сделать либо

df$FIXED_DATE <- fix_date(df$ISSUE_DATE)

, либо

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

Первый - идиоматический способ сделать это.

0 голосов
/ 15 июня 2019

Вам не нужно писать функцию и делать это для преобразования строки в даты. Ниже приведен код, который вы ищете. Кстати, 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...