পূর্ববর্তী এন সারির উপর ভিত্তি করে শর্তাধীন একটি নতুন কলাম তৈরি করা হচ্ছে


9

আমার নীচের মত একটি ডেটা ফ্রেম সেট আপ হয়েছে:

 df <- data.frame("id" = c(111,111,111,222,222,222,222,333,333,333,333), 
                  "Location" = c("A","B","A","A","C","B","A","B","A","A","A"), 
                  "Encounter" = c(1,2,3,1,2,3,4,1,2,3,4))

      id Location Encounter
1  111        A         1
2  111        B         2
3  111        A         3
4  222        A         1
5  222        C         2
6  222        B         3
7  222        A         4
8  333        B         1
9  333        A         2
10 333        B         3
11 333        A         4

আমি মূলত বাইনারি পতাকা তৈরি করার চেষ্টা করছি প্রতিটি আইডি গ্রুপের জন্য পূর্ববর্তী এনকাউন্টারে একটি অবস্থান is সুতরাং এটি দেখতে হবে:

    id Location Encounter Flag
1  111        A         1    0
2  111        B         2    0
3  111        A         3    1
4  222        A         1    0
5  222        C         2    0
6  222        B         3    0
7  222        A         4    1
8  333        B         1    0
9  333        A         2    0
10 333        B         3    1
11 333        A         4    1

আমি কীভাবে একটি বিবৃতি লিখতে হবে তা বোঝার চেষ্টা করছিলাম:

library(dplyr)

df$Flag <- case_when((df$id - lag(df$id)) == 0 ~ 
                case_when(df$Location == lag(df$Location, 1) | 
                          df$Location == lag(df$Location, 2) | 
                          df$Location == lag(df$Location, 3) ~ 1, T ~ 0), T ~ 0)

    id Location Flag
1  111        A    0
2  111        B    0
3  111        A    1
4  222        A    0
5  222        C    0
6  222        B    0
7  222        A    1
8  333        B    0
9  333        A    1
10 333        B    1
11 333        A    1

তবে এটির ক্ষেত্রে যেখানে সারি 9 ভুলভাবে একটি 1 নির্ধারিত হচ্ছে এবং প্রকৃত ডেটাতে 15+ টি এনকাউন্টার রয়েছে তাই এটি বেশ জটিল হয়ে উঠেছে। আমি এমন কিছু করার উপায় খুঁজে পাওয়ার আশা করছিলাম

lag(df$Location, 1:df$Encounter)

তবে আমি জানি lag()যে কে এর জন্য একটি পূর্ণসংখ্যা প্রয়োজন, যাতে নির্দিষ্ট আদেশটি কাজ করে না।


স্ট্যাক ওভারফ্লোতে স্বাগতম! আপনি এসও রুটিনগুলি সম্পর্কে অন্তর্দৃষ্টি জিজ্ঞাসা করার কারণে, কেউ যখন আপনার প্রশ্নের উত্তর দেয় তখন কী করা উচিত সে সম্পর্কে আপনি এটি পড়তে চাইতে পারেন । তদ্ব্যতীত, ট্যুরটি নেওয়া এবং কীভাবে জিজ্ঞাসা করতে হয় তা পড়ুন (আপনার প্রশ্নটি দুর্দান্ত তবে এটি আপনাকে ব্যাজ দেবে) এটি কোনও খারাপ ধারণা নয় । আশা করি আপনি এখানে প্রায়শই প্রায়শই দেখতে পাবেন। চিয়ার্স।
এম--

উত্তর:


6

সঙ্গে একটি বিকল্প duplicated

library(dplyr)
df %>% 
  group_by(id) %>% 
  mutate(Flag = +(duplicated(Location)))
# A tibble: 11 x 4
# Groups:   id [3]
#      id Location Encounter  Flag
#   <dbl> <fct>        <dbl> <int>
# 1   111 A                1     0
# 2   111 B                2     0
# 3   111 A                3     1
# 4   222 A                1     0
# 5   222 C                2     0
# 6   222 B                3     0
# 7   222 A                4     1
# 8   333 B                1     0
# 9   333 A                2     0
#10   333 A                3     1
#11   333 A                4     1

4

বেস বেসে, আমরা এবং এর সাথে aveগোষ্ঠীযুক্ত ব্যবহার করতে পারিidLocation এবং 1 থেকে দলের দ্বিতীয় সারির থেকে সব মান চালু করুন।

df$Flag <- as.integer(with(df, ave(Encounter, id, Location, FUN = seq_along) > 1))
df

#    id Location Encounter Flag
#1  111        A         1    0
#2  111        B         2    0
#3  111        A         3    1
#4  222        A         1    0
#5  222        C         2    0
#6  222        B         3    0
#7  222        A         4    1
#8  333        B         1    0
#9  333        A         2    0
#10 333        A         3    1
#11 333        A         4    1

ব্যবহার করে dplyr, যে হবে

library(dplyr)

df %>%  group_by(id, Location) %>%  mutate(Flag = as.integer(row_number() > 1))

4

ব্যবহার data.table:

library(data.table)

dt[, flag:=1]
dt[, flag:=cumsum(flag), by=.(id,Location)]
dt[, flag:=ifelse(flag>1,1,0)]

ডেটা:

dt <- data.table("id" = c(111,111,111,222,222,222,222,333,333,333,333), 
                 "Location" = c("A","B","A","A","C","B","A","B","A","A","A"),
                 "Encounter" = c(1,2,3,1,2,3,4,1,2,3,4))

4

আরও সাধারণ data.tableসমাধানটি ব্যবহার করা হবে .Nবা rowid:

library(data.table)

setDT(dt)[, Flag := +(rowid(id, Location)>1)][]

অথবা

setDT(df)[, Flag := +(seq_len(.N)>1), .(id, Location)][]
#>      id Location  Encounter Flag
#> 1:  111        A         1    0
#> 2:  111        B         2    0
#> 3:  111        A         3    1
#> 4:  222        A         1    0
#> 5:  222        C         2    0
#> 6:  222        B         3    0
#> 7:  222        A         4    1
#> 8:  333        B         1    0
#> 9:  333        A         2    0
#> 10: 333        A         3    1
#> 11: 333        A         4    1

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.