library(data.table)
DATA=data.table(STUDENT= c(1,2,3,4),
    DOG_1= c("a","e","a","c"),
    DOG_2= c("a","e","d","b"),
    DOG_3= c("a","d","b","c"),
    CAT_1= c("c","a","d","c"),
    CAT_2= c("c","d","a","b"),
    MOUSE_1= c("d","b","e","b"),
    MOUSE_2= c("c","a","b","e"),
    MOUSE_3= c("a","b","b","e"),
    MOUSE_4= c("b","c","a","d"))

Ini adalah bagaimana data saya terlihat di atas. Saya ingin berakhir dengan data baru yang terlihat seperti ini:

enter image description here

Di mana 'a' sama dengan 1; 'B' sama dengan 2; 'C' sama dengan 3; 'd' sama dengan 4; 'E' sama dengan 5 dan untuk mendapatkan nilai misalnya Mahasiswa 1 Anjing sama dengan 3 didapat dengan mengubah huruf ke nilai-nilai dan merangkum.

2
bvowe 28 Mei 2021, 23:51

2 jawaban

Jawaban Terbaik

Jika kita ingin menggunakan solusi data.table, melt the 'data', dengan menentukan patterns} dari nama kolom menjadi format 'Panjang', kemudian menggunakan nama {{x3} ( 'keyval'), dikelompokkan oleh 'siswa, loop di atas kolom yang ditentukan dalam .SDcols, cocokkan dan ganti nilai dengan nilai integer dan sum

library(data.table)
nm1 <- unique(sub("_\\d+$", "", names(DATA)[-1]))      
dt1 <- melt(DATA, id.var = 'STUDENT', 
   measure = patterns(nm1), value.name = nm1)
keyval <- setNames(1:5, letters[1:5])

dt1[, lapply(.SD, function(x) sum(keyval[x], 
           na.rm = TRUE)), by = STUDENT, .SDcols = nm1]

-keluaran

#   STUDENT DOG CAT MOUSE
#1:       1   3   6    10
#2:       2  14   5     8
#3:       3   7   5    10
#4:       4   8   5    16

Opsi serupa di tidyverse akan

library(dplyr)
library(tidyr)
DATA %>% 
    pivot_longer(cols = -STUDENT, names_to = c('.value', 'grp'), 
          names_sep='_') %>%
    group_by(STUDENT) %>% 
    summarise(across(all_of(nm1), ~ sum(keyval[.], na.rm = TRUE)))
# A tibble: 4 x 4
#  STUDENT   DOG   CAT MOUSE
#    <dbl> <int> <int> <int>
#1       1     3     6    10
#2       2    14     5     8
#3       3     7     5    10
#4       4     8     5    16
3
akrun 28 Mei 2021, 21:01

Opsi data.table lainnya menggunakan melt + dcast

dcast(
  melt(DATA, id.var = "STUDENT")[
    ,
    c("variable", "value") := .(gsub("_.*", "", variable),
      value = setNames(1:5, c("a", "b", "c", "d", "e"))[value]
    )
  ], STUDENT ~ variable, sum
)

Memberi

   STUDENT CAT DOG MOUSE
1:       1   6   3    10
2:       2   5  14     8
3:       3   5   7    10
4:       4   5   8    16
1
ThomasIsCoding 28 Mei 2021, 21:10