web-dev-qa-db-ja.com

dplyr :: case_whenとの型の競合を回避する

dplyr::case_when内でdplyr::mutateを使用して、いくつかの値を欠損値に設定し、同時に他の値を再コーディングする新しい変数を作成しようとしています。

ただし、値をNAに設定しようとすると、newsが論理的であるため変数NAを作成できないというエラーが表示されます。

Mutate_impl(.data、dots)のエラー:
評価エラー:論理型ではなく、double型である必要があります。

これを使用して、データフレーム内の非論理ベクトルのNAに値を設定する方法はありますか?

library(dplyr)    

# Create data
df <- data.frame(old = 1:3)

# Create new variable
df <- df %>% dplyr::mutate(new = dplyr::case_when(old == 1 ~ 5,
                                                  old == 2 ~ NA,
                                                  TRUE ~ old))

# Desired output
c(5, NA, 3)
23
user3614648

?case_when

すべてのRHSは、同じタイプのベクトルに評価される必要があります。

実際には2つの可能性があります。

1)newを数値ベクトルとして作成

df <- df %>% mutate(new = case_when(old == 1 ~ 5,
                                    old == 2 ~ NA_real_,
                                    TRUE ~ as.numeric(old)))

ご了承ください NA_real_NAの数値バージョンです。元のデータフレームで整数として作成したため、oldを数値に変換する必要があります。

あなたが得る:

str(df)
# 'data.frame': 3 obs. of  2 variables:
# $ old: int  1 2 3
# $ new: num  5 NA 3

2)newを整数ベクトルとして作成

df <- df %>% mutate(new = case_when(old == 1 ~ 5L,
                                    old == 2 ~ NA_integer_,
                                    TRUE ~ old))

ここに、 5Lは5を整数型にし、NA_integer_は、NAの整数バージョンです。

したがって、今回のnewは整数です:

str(df)
# 'data.frame': 3 obs. of  2 variables:
# $ old: int  1 2 3
# $ new: int  5 NA 3
35
Scarabee

これを試して ?

df %>% dplyr::mutate(new = dplyr::case_when(.$old == 1 ~ 5,
                                                  .$old == 2 ~ NA_real_,
                                                  TRUE~.$old))

> df
  old new
1   1   5
2   2  NA
3   3   3
2
WeNYoBen