4

私は自分のプロジェクトのために R を学んでいますが、現在の問題の解決策をグーグルで見つけることができませんでした。

100 個までの csv ファイルがあり、それらに対して正確な一連の操作を実行する必要があります。私はそれらを別々のオブジェクトとして読み込んでいますが(おそらくrスタイルが不適切だと思います)、ループできる関数を書くことができませんでした。各 csv は、10 進数形式の日付を含む列を含む情報を含むデータフレームです。年と日を含む 2 つの新しい列を作成する必要があります。手動で行う方法を見つけました。プロセスを自動化する方法を見つけたいと思います。これが私がやってきたことです:

#setup
library(lubridate)  #Used to check for leap years
df.00 <- data.frame( site = seq(1:10), date = runif(10,1980,2000 ))


#what I need done

df.00$doy <- NA  # make an empty column which I'm going to place the day of the year
df.00$year <- floor(df.00$date) # grabs the year from the date column
df.00$dday <- df.00$date - df.00$year # get the year fraction. intermediate step.

# multiply the fraction year by 365 or 366 if it's a leap year to give me the day of the year
df.00$doy[which(leap_year(df.00$year))] <- round(df.00$dday[which(leap_year(df.00$year))] * 366)
df.00$doy[which(!leap_year(df.00$year))] <- round(df.00$dday[which(!leap_year(df.00$year))] * 365)

上記は、エレガントではありませんが、私が望むことを行います。ただし、これを他のデータ フレーム df.01 ~ df.99 に対して行う必要があります。これまでのところ、関数または for ループに配置できませんでした。関数に配置すると:

funtest <- function(x) {
    x$doy <- NA
}

funtest(df.00) は何もしません。これは、関数が r でどのように機能するかについての私の理解から期待されることですが、それを for ループでラップすると、次のようになります。

for(i in c(df.00)) { 
    i$doy <- NA }

「In i$doy <- NA : Coercing LHS to a list」というメッセージが数回表示されます。これは、ループがデータフレームを単一のユニットとして扱っているのではなく、おそらくフレーム内の各列を調べていることを示しています。
私が何をすべきかについての洞察を本当に感謝します。bash と awk を使用してこれを簡単に解決できたと思いますが、r を使用して無能になりたいと思います

4

1 に答える 1