আর-তে সদৃশ সারি চিহ্নিত করুন এবং চিহ্নিত করুন


11

আমি 2 টি কলামের ভিত্তিতে সদৃশ সারি চিহ্নিত করতে এবং চিহ্নিত করতে চাই। আমি প্রতিটি নকলের জন্য একটি অনন্য শনাক্তকারী তৈরি করতে চাই যাতে আমি জানি না যে সারিটি একটি সদৃশ, তবে এটি কোন সারিটির সাথে সদৃশ। আমার কাছে একটি ডেটাফ্রেম রয়েছে যা নীচে কিছু সদৃশ আইটেম জোড়া (ফিট এবং সিটে) এবং নকল নয় এমন অন্যান্য জোড়া রয়েছে। আইটেম জোড়াটি সদৃশ হওয়ার সময়, তাদের থাকা তথ্যগুলি অনন্য is মান 1 নয়)

বর্তমান তথ্য ফ্রেম

     value1 value2 value3 fit   sit  
[1,] "1"    NA     NA     "it1" "it2"
[2,] NA     "3"    "2"    "it2" "it1"
[3,] "2"    "3"    "4"    "it3" "it4"
[4,] NA     NA     NA     "it4" "it3"
[5,] "5"    NA     NA     "it5" "it6"
[6,] NA     NA     "2"    "it6" "it5"
[7,] NA     "4"    NA     "it7" "it9"

কোড উদাহরণস্বরূপ ডেটা ফ্রেম উত্পন্ন

value1<-c(1,NA,2,NA,5,NA,NA)
value2<-c(NA,3,3,NA,NA,NA, 4)
value3<-c(NA,2,4,NA,NA,2, NA)
fit<-c("it1","it2","it3","it4", "it5", "it6","it7")
sit<-c("it2","it1","it4","it3", "it6", "it5", "it9")
df.now<-cbind(value1,value2,value3, fit, sit)

আমি যা চাই তা হ'ল এটিকে এমন একটি ডেটাফ্রেমে রূপান্তর করা যা:

পছন্দসই ডেটাফ্রেম

     val1 val2 val3 it1   it2  
[1,] "1"  "3"  "2"  "it1" "it2"
[2,] "2"  "3"  "4"  "it3" "it4"
[3,] "5"  NA   "2"  "it5" "it6"
[4,] NA   "4"  NA   "it7" "it9"

আমি নিম্নলিখিত পদক্ষেপগুলি করার কথা ভাবছিলাম: ১. ফিট ব্যবহার করে নতুন ভেরিয়েবল তৈরি করুন এবং নকল জোড়া সনাক্ত করতে সবচেয়ে কম আইটেম এবং সর্বাধিক আইটেমের সাথে বসুন uplic. সদৃশ আইটেমের জোড়গুলি চিহ্নিত করুন ৩. অনন্য তথ্য নির্বাচন করতে এবং পূরণ করতে আইফেল ব্যবহার করুন।

আমি জানি কীভাবে 1 এবং 3 পদক্ষেপটি করা যায় তবে আমি দ্বিতীয় ধাপে আটকে আছি think আমার মনে হয় আমার যা করা দরকার তা হ'ল সত্য / মিথ্যা সদৃশ সনাক্তকরণ নয়, তবে প্রতিটি আইটেমের জোড়াটির জন্য একটি অনন্য সনাক্তকারী সহ একটি কলাম থাকতে পারে (সেখানে আমার পদক্ষেপ 1 এর কারণে 2 টি অতিরিক্ত সারি রয়েছে):

     value1 value2 value3 fit   sit   lit   hit    dup
[1,] "1"    NA     NA     "it1" "it2" "it1" "it2"   1
[2,] NA     "3"    "2"    "it2" "it1" "it1" "it2"   1
[3,] "2"    "3"    "4"    "it3" "it4" "it3" "it4"   2
[4,] NA     NA     NA     "it4" "it3" "it3" "it4"   2
[5,] "5"    NA     NA     "it5" "it6" "it5" "it6"   3
[6,] NA     NA     "2"    "it6" "it5" "it5" "it6"   3
[7,] NA     "4"    NA     "it7" "it9" "it7" "it9"   NA

আমি কীভাবে এটি করব তা নিশ্চিত নই।

আমি যা জিজ্ঞাসা করছি তা হয় দ্বিতীয় ধাপে সহায়তা করা বা সম্ভবত আমি বর্ণিত পদক্ষেপগুলির চেয়ে এটি সমাধানের আরও ভাল উপায় হতে পারে।

উত্তর:


6

একটি dplyrবিকল্প হতে পারে:

df.now %>%
 group_by(pair = paste(pmax(fit, sit), pmin(fit, sit), sep = "_")) %>%
 summarise_at(vars(starts_with("value")), ~ ifelse(all(is.na(.)), 
                                                   NA,
                                                   first(na.omit(.))))

  pair    value1 value2 value3
  <chr>    <dbl>  <dbl>  <dbl>
1 it2_it1      1      3      2
2 it4_it3      2      3      4
3 it6_it5      5     NA      2
4 it9_it7     NA      4     NA

এবং যদি আপনার পৃথক কলামগুলিতেও জুড়ি প্রয়োজন হয়, তবে সংযোজন সহ tidyrআপনি এটি করতে পারেন:

df.now %>%
 group_by(pair = paste(pmax(fit, sit), pmin(fit, sit), sep = "_")) %>%
 summarise_at(vars(starts_with("value")), ~ ifelse(all(is.na(.)), 
                                                   NA,
                                                   first(na.omit(.)))) %>%
 separate(pair, into = c("fit", "hit"), sep = "_", remove = FALSE)

  pair    fit   hit   value1 value2 value3
  <chr>   <chr> <chr>  <dbl>  <dbl>  <dbl>
1 it2_it1 it2   it1        1      3      2
2 it4_it3 it4   it3        2      3      4
3 it6_it5 it6   it5        5     NA      2
4 it9_it7 it9   it7       NA      4     NA

ধন্যবাদ! এটি ভাল কাজ করে। আমি আইটেমগুলি পৃথক করার বিকল্পে যুক্ত করার প্রশংসা করি।
হিদার ক্লার্ক

3

আইএনজি !duplicated()পরে ব্যবহার করুন sort

df.now[!duplicated(t(apply(df.now[, c("fit", "sit")], 1, sort))), ]
#       value1 value2 value3 fit   sit  
# [1,] "1"    NA     NA     "it1" "it2"
# [2,] "2"    "3"    "4"    "it3" "it4"
# [3,] "5"    NA     NA     "it5" "it6"
# [4,] NA     "4"    NA     "it7" "it9"

দ্রুত প্রতিক্রিয়া জন্য আপনাকে ধন্যবাদ. তবে এই সমাধানটি আমার রাখা তথ্য মুছে ফেলবে। আমি একই আইটেম জোড়ার 2 টি সারি জুড়ে পাওয়া 3 মান কলামগুলি থেকে তথ্যটি একত্রিত করতে চাই। এটি পরিষ্কার না হলে আমাকে জানতে দিন
হিদার ক্লার্ক

2

melt/dcastথেকে ব্যবহারdata.table

library(data.table)
dcast(melt(setDT(df.now)[, c('fit1', 'sit1') := .(pmin(fit, sit), 
    pmax(fit, sit))], measure = patterns("^value"), na.rm = TRUE),
     fit1 + sit1 ~ variable, value.var = 'value')
#   fit1 sit1 value1 value2 value3
#1:  it1  it2      1      3      2
#2:  it3  it4      2      3      4
#3:  it5  it6      5     NA      2
#4:  it7  it9     NA      4     NA

উপাত্ত

df.now <- data.frame(value1,value2,value3, fit, sit, stringsAsFactors = FALSE)

2

অন্য data.tableবিকল্প:

library(data.table)
as.data.table(df.now)[, lapply(.SD, function(x) first(x[!is.na(x)])), 
    .(it1=pmin(fit, sit), it2=pmax(fit, sit)), 
    .SDcols=value1:value3]

আউটপুট:

   it1 it2 value1 value2 value3
1: it1 it2      1      3      2
2: it3 it4      2      3      4
3: it5 it6      5   <NA>      2
4: it7 it9   <NA>      4   <NA>

1

এখানে ডেটা টেবিল ব্যবহার করার চেষ্টা করা হচ্ছে। আপনার ডেটা বলা হয় mydf। প্রথমে, আমি বাছাই করেছি fitএবং sitপ্রতিটি সারির জন্য এবং একটি নতুন ভেরিয়েবল তৈরি করেছি group,। তারপরে, প্রতিটি গ্রুপের জন্য, আমি তিনটি মান কলামে (যেমন, মান 1, মান 2, এবং মান 3) মানগুলি বাছাই করেছি। অবশেষে, আমি প্রতিটি দলের জন্য প্রথম সারিটি বের করেছি।

library(data.table)

mydt <- setDT(mydf)[, group := paste(sort(.SD), collapse = "_"),
                    .SD = c("fit", "sit"), by = 1:nrow(mydf)][,
                        c("value1", "value2", "value3") := lapply(.SD, sort),
                        .SDcols = value1:value3, by = group][, .SD[1], by = group]

mydt[]

#     group value1 value2 value3 fit sit
#1: it1_it2      1      3      2 it1 it2
#2: it3_it4      2      3      4 it3 it4
#3: it5_it6      5     NA      2 it5 it6
#4: it7_it9     NA      4     NA it7 it9

ডেটা

mydf <- structure(list(value1 = c(1L, NA, 2L, NA, 5L, NA, NA), value2 = c(NA, 
3L, 3L, NA, NA, NA, 4L), value3 = c(NA, 2L, 4L, NA, NA, 2L, NA
), fit = c("it1", "it2", "it3", "it4", "it5", "it6", "it7"), 
sit = c("it2", "it1", "it4", "it3", "it6", "it5", "it9")), class = "data.frame", row.names = c(NA, 
-7L))

1

এটি মিলিয়ে tidyrএর pivot_longerসাথে ব্যবহার করেও করা যেতে পারে :values_drop_na = TRUEpivot_wider

library(tidyverse)

mydf %>%
   mutate(it1 = pmin(fit, sit), it2 = pmax(fit, sit)) %>%
   pivot_longer(cols = starts_with("value"), values_drop_na = TRUE) %>%
   pivot_wider(id_cols = c("it1", "it2"))

#> # A tibble: 4 x 5
#>   it1   it2   value1 value2 value3
#>   <chr> <chr>  <int>  <int>  <int>
#> 1 it1   it2        1      3      2
#> 2 it3   it4        2      3      4
#> 3 it5   it6        5     NA      2
#> 4 it7   it9       NA      4     NA

উপাত্ত

mydf <- structure(list(value1 = c(1L, NA, 2L, NA, 5L, NA, NA), value2 = c(NA, 
3L, 3L, NA, NA, NA, 4L), value3 = c(NA, 2L, 4L, NA, NA, 2L, NA
), fit = c("it1", "it2", "it3", "it4", "it5", "it6", "it7"), 
sit = c("it2", "it1", "it4", "it3", "it6", "it5", "it9")), class = "data.frame", row.names = c(NA, 
-7L))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.