私はRにとって非常に新しく、私の問題の解決策を見つけられませんでした。あなたが私を助けてくれることを本当に願っています。
列と観測値は他にもありますが、データフレームは次のようになります。
dt <- data.frame(hid = c(1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4),
syear = c(2000, 2001, 2003, 2003, 2003, 2000, 2000, 2001, 2001, 2002, 2002),
employlvl = c("Full-time", "Part-time", "Part-time", "Unemployed", "Unemployed",
"Full-time", "Full-time", "Full-time", "Unemployed", "Part-time",
"Full-time"),
relhead = c("Head", "Head", "Head", "Partner", "other", "Head",
"Partner", "Head", "Partner", "Head", "Partner"))
| hid | syear | employlvl | relhead |
|-----|-------|-------------|-----------------------|
| 1 | 2000 | Full-time | Head |
| 2 | 2001 | Part-time | Head |
| 2 | 2003 | Part-time | Head |
| 2 | 2003 | Unemployed | Partner |
| 2 | 2003 | Unemployed | other |
| 4 | 2000 | Full-time | Head |
| 4 | 2000 | Full-time | Partner |
| 4 | 2001 | Full-time | Head |
| 4 | 2001 | Unemployed | Partner |
| 4 | 2002 | Part-time | Head |
| 4 | 2002 | Full-time | Partner |
パートナーの雇用レベルを示す別の列を作成し、次の出力を取得したいと考えています。
| hid | syear | employlvl | relhead | Partner |
|-----|-------|-------------|-----------------------|-------------------|
| 1 | 2000 | Part-time | Head | NA |
| 2 | 2001 | Part-time | Head | NA |
| 2 | 2003 | Part-time | Head | Unemployed |
| 2 | 2003 | Unemployed | Partner | NA |
| 2 | 2003 | Unemployed | other | NA |
| 4 | 2000 | Full-time | Head | Full-time |
| 4 | 2000 | Full-time | Partner | NA |
| 4 | 2001 | Full-time | Head | Unemployed |
| 4 | 2001 | Unemployed | Partner | NA |
| 4 | 2002 | Part-time | Head | Full-time |
| 4 | 2002 | Full-time | Partner | NA |
現在、私は次のコードを使用しています。 (再びユーザーycwに感謝します)
library(dplyr)
library(tidyr)
dt2 <- dt %>%
group_by(hid, syear) %>%
filter(n() > 1) %>%
filter(`relhead` != "Child") %>%
spread(relhead, employlvl) %>%
mutate(Relation = "Head") %>%
rename(`Employment Partner` = Partner) %>%
select(-Head)
dt3 <- dt %>%
left_join(dt2, by = c("hid", "syear", "relhead" = "Relation"))
この小さなデータセットでは、コードは完全に正常に機能します。しかし、データ全体を試すとすぐに次の結果が得られます。
Error: Data source must be a dictionary
手伝ってくれてどうもありがとう。
他の回答で述べたように、これは一意でない名前が原因です。サンプルを変更することでエラーを再現できました(relhead
の3番目の要素)
_dt <- data.frame(
hid = c(1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4),
syear = c(2000, 2001, 2003, 2003, 2003, 2000, 2000, 2001, 2001, 2002, 2002),
employlvl = c("Full-time", "Part-time", "Part-time", "Unemployed", "Unemployed",
"Full-time", "Full-time", "Full-time", "Unemployed", "Part-time",
"Full-time"),
relhead = c("Head", "Head", "Employment Partner", "Partner", "other", "Head",
"Partner", "Head", "Partner", "Head", "Partner")
)
_
その場合、spread
は最初に_"Employment Partner"
_列を作成し、rename
は2番目に作成します。 _"Employment Partner"
_、_"Relation"
_(およびおそらくhid
、syear
)のいずれかが_dt$relhead
_にあるかどうかを確認する必要がありますmutate(Relation=...)
)によって上書きされます。
最小限の再現可能な例:
_data_frame(g = c("a1","a2","a3"), i=1) %>%
spread(g, i) %>%
rename(a1 = a3) %>%
select(-a1)
_
同じエラーメッセージで同様の問題が発生しました。データセットを注意深く確認したところ、同じ名前の列が2つあることがわかりました。それらのいずれかの名前を変更した後、エラーなしで動作します。
2つの列の名前が同じで、1つの列名を変更すると同じエラーが発生しました
名前()<-c(...)
私のためにトリックをしました。
dplyr
パッケージのrename()
ステートメントで2つの同じ新しい名前を不注意に使用すると、同じエラーメッセージが表示されました。以前に同じ変数名をすでに持っていた可能性があるため、names(df2)
とunique(names(df2))
を比較します。
rename
呼び出しの後にselect(-variable)
を実行したことが原因です。同じエラーが発生し、「名前変更」呼び出しを削除して、同じselect(-variable)を実行すると機能しました。
なぜそうなのか、手がかりはありませんが、それがエラーの原因です。
select(-Head)
を実行した後にのみエラーが発生する場合は、おそらくベースRコマンドを使用して同じことを達成することで回避策を見つけることができます。
_library(dplyr)
library(tidyr)
dt2 <- dt %>%
group_by(hid, syear) %>%
filter(n() > 1) %>%
filter(`relhead` != "Child") %>%
spread(relhead, employlvl) %>%
mutate(Relation = "Head") %>%
rename(`Employment Partner` = Partner)
_
上記の部分は元のコードと同じです。その後、次を実行します。
_dt2$Head <- NULL
_
これは、Head
列を削除するための基本Rコマンドです。これは、select(-Head)
が実行したいことと同じです。
そして、残りのコードを実行してデータフレームを結合できます。
_dt3 <- dt %>%
left_join(dt2, by = c("hid", "syear", "relhead" = "Relation"))
_
再現可能な例を提供しなかったため、このエラーメッセージの実際の意味を理解することはできませんでしたが、この回避策は現時点でのタスクの達成に役立つ可能性があります。
私はこれがもう少し古いことを知っていますが、すべての興味がある人にとって、問題は(私は信じています)plyrとdplyrの同じ名前の関数の動作の違いです。したがって、両方をロードすると、予期しない結果が生じる可能性があります。 group_byでこれを確認し、同様に要約します。
一般的に、これに対処するために見つけた最善の方法は、dplyr :: select、dplyr :: renameなどを使用することです。
さらに良いことは、dplyrがこの時点でカバーしているため、plyrを使用しないことです。しかし、plyrを使用するレガシーコードがあるので、やりたくありません。