Saya ingin mendapatkan bantuan pada masalah berikut. Saya memiliki bingkai data di mana saya memiliki kolom v1, v2, dll. Saya ingin tahu apa kolom berbeda dalam dataset ini. Kolom pertama adalah "Change_no" dan kolom lainnya adalah nomor seri yang berlaku (dalam hal ini Y) atau tidak berlaku (dalam hal ini, n) untuk masing-masing angka perubahan.

Saya ingin menemukan kolom yang berbeda dari angka perubahan dan setelah itu untuk masing-masing nomor seri, saya ingin memetakannya ke kolom angka perubahan "berbeda" yang ditemukan. Saya percaya bahwa saya tidak melakukan ini dengan cara yang paling efisien.

Dalam contoh, di bawah ini, V1 dan V4 identik dan v2 dan v5 identik. v3 dan v6 tidak memiliki kolom duplikat. Ini berarti bahwa kolom non-duplikat adalah: V1, V2, V3, V6. Saya sekarang ingin mendapatkan pemetaan seperti di bawah ini

V1, v1
v2, v5
v3, v3
v4, v1
v5, v5
v6, v6.

# get distinct columns and map each column to the distinct column found
library("dplyr")   
library("purrr")   
library("tidyr")   
library("reshape2")   
library("plyr")   
   
   
text1 <- ("   
          change_no,v1,v2,v3,v4,v5,v6   
c1,y,n,y,y,n,n   
          c2,y,n,n,y,n,y   
          c3,n,y,y,n,y,n   
          c4,n,y,y,n,y,y   
          c5,n,n,n,n,n,y   
          c6,y,y,y,y,y,n")   
   
#read the above information and bring that into a dataframe. Now we have the change numbers and the serial numbers that have a y or n for each of the change numbers   
df1 <- read.table(textConnection(text1),  header = TRUE, stringsAsFactors=FALSE, strip.white = TRUE, sep=",")   
head(df1)   
   
# do some gather and spread so that we can get the data into rows and we can use constructs like unique etc.   
df2 <- gather(df1, key = "var", value = "val", -c(change_no))   
head(df2)   
   
df3 <- spread(df2, change_no, val)   
head(df3)   
row.names(df3) <- df3$var   
names(df3)   
   
#the data frame df4 now has the change numbers as columns and the serial numbers as row names   
df4 <- select(df3, -c(var))   
head(df4)   
names(df4)   
   
# get the unique rows from the data frame df4. These are the columns that are unique in the dataset df1   
df5 <- unique(df4)   
head(df5)   
nrow(df5)   
names(df5)   
   
#the below is not working. I would have expected that we will get back the rows with row names v1 and v4 but that does not seem to be the case   
match <- match_df(df5[1,],df4 )   
   
   
r
0
Satish Vadlamani 29 Mei 2021, 00:36

1 menjawab

Jawaban Terbaik

Anda dapat mencoba kode di bawah ini

u <- which(outer(df1[-1], df1[-1], Vectorize(function(x, y) all(x == y))), arr.ind = TRUE)
res <- data.frame(matrix(names(df1[-1])[u[!duplicated(row.names(u)), ]], ncol = 2))

Yang memberikan

> res
  X1 X2
1 v1 v1
2 v4 v1
3 v2 v2
4 v5 v2
5 v3 v3
6 v6 v6
1
ThomasIsCoding 28 Mei 2021, 22:00