Saya memiliki data kuesioner skala 4, dengan pertanyaan yang memiliki NA sesuai desain. Misalnya, jika jawaban pertanyaan 1 adalah tidak (berkode 0), maka pertanyaan lainnya tidak berlaku untuk peserta dan akan diberi kode NA. Namun, NA ini berbeda dari orang-orang yang hanya memilih untuk mengabaikan pertanyaan itu. Jadi saya mencoba mengganti NAs ke Q2 & 3 dengan 0 hanya jika jawaban untuk Q1 adalah 0, jika tidak biarkan NAS seperti itu. Saya telah membuat kerangka data untuk lebih menjelaskan situasi saya:

Q1 <- c(0,0,1,2,0,4)
Q2 <- c(NA,NA,2,1,NA,NA)
Q3 <- c(NA,NA,2,1,NA,4)

data <- cbind(Q1,Q2,Q3)

  Q1 Q2 Q3 
1  0  NA NA  
2  0  NA NA 
3  1  2  2  
4  2  1  1  
5  0  NA NA  
6  4  NA  4

Keluaran yang diinginkan:

 Q1   Q2 Q3 
1  0  0   0  
2  0  0   0 
3  1  2   2  
4  2  1   1  
5  0  0   0  
6  4  NA  4

Pada output yang diinginkan, jika Q1 adalah 0, maka NA pada Q2 dan 3 diubah menjadi 0. Dengan partisipan 6, NA dibiarkan apa adanya.

Saya belajar sendiri R dan benar-benar telah berjuang dengan ini. Saya sudah mencoba fungsi if,mutate_if, if_else, dan case_when tetapi tidak berhasil. Seseorang tolong tolong saya.

Berikut ini contoh salah satu kode yang saya coba yang memberi saya kesalahan.

data %>% 
ifelse (Q1 == 0) {
  mutate(Q2 = coalesce(Q2,0))
  }
1
Thandeka 4 Januari 2021, 21:42

3 jawaban

Jawaban Terbaik

Ini harus bekerja:

library(dplyr)
data %>% 
    as.data.frame() %>% 
    mutate(across(c(Q2,Q3), ~case_when(Q1 == 0 ~ 0, TRUE ~ .)))
#   Q1 Q2 Q3
# 1  0  0  0
# 2  0  0  0
# 3  1  2  2
# 4  2  1  1
# 5  0  0  0
# 6  4 NA  4

Kode Anda gagal karena ifelse() menginginkan vektor sebagai input dan menyediakan vektor sebagai output. Anda juga dapat menggunakan ifelse() alih-alih case_when() jika Anda mau.

library(dplyr)
data %>% 
    as.data.frame() %>% 
    mutate(across(c(Q2,Q3), ~ifelse(Q1 == 0, 0, .)))
2
DaveArmstrong 4 Januari 2021, 18:47

Di base R kita dapat membuat indeks logis untuk i, pilih kolom di j dan lakukan tugas

data[!data$Q1, -1] <- 0
data
#  Q1 Q2 Q3
#1  0  0  0
#2  0  0  0
#3  1  2  2
#4  2  1  1
#5  0  0  0
#6  4 NA  4

Data

data <- data.frame(Q1,Q2,Q3)
2
akrun 4 Januari 2021, 19:42

Opsi data.table

> setDT(data)[Q1 == 0, `:=`(Q2 = 0, Q3 = 0)][]
   Q1 Q2 Q3
1:  0  0  0
2:  0  0  0
3:  1  2  2
4:  2  1  1
5:  0  0  0
6:  4 NA  4
2
ThomasIsCoding 4 Januari 2021, 23:03