আমি কীভাবে কোনও আর ডেটাফ্রেমে শূন্যের সাথে এনএ মানগুলি প্রতিস্থাপন করব?


727

আমার একটি ডেটা ফ্রেম আছে এবং কিছু কলাম রয়েছে NA মান রয়েছে।

আমি কীভাবে এই NAমানগুলি শূন্যের সাথে প্রতিস্থাপন করব ?


13
ছোট পরিবর্তন stackoverflow.com/questions/7279089/... (আমি অনুসন্ধান করে পাওয়া যা "[R] শূন্য দিয়ে এন প্রতিস্থাপন") ...
বেন Bolker

25
ঘ [is.na (ঘ)] <- 0
psychonomics

উত্তর:


878

@ Gsk3 উত্তরে আমার মন্তব্য দেখুন। একটি সহজ উদাহরণ:

> m <- matrix(sample(c(NA, 1:10), 100, replace = TRUE), 10)
> d <- as.data.frame(m)
   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1   4  3 NA  3  7  6  6 10  6   5
2   9  8  9  5 10 NA  2  1  7   2
3   1  1  6  3  6 NA  1  4  1   6
4  NA  4 NA  7 10  2 NA  4  1   8
5   1  2  4 NA  2  6  2  6  7   4
6  NA  3 NA NA 10  2  1 10  8   4
7   4  4  9 10  9  8  9  4 10  NA
8   5  8  3  2  1  4  5  9  4   7
9   3  9 10  1  9  9 10  5  3   3
10  4  2  2  5 NA  9  7  2  5   5

> d[is.na(d)] <- 0

> d
   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1   4  3  0  3  7  6  6 10  6   5
2   9  8  9  5 10  0  2  1  7   2
3   1  1  6  3  6  0  1  4  1   6
4   0  4  0  7 10  2  0  4  1   8
5   1  2  4  0  2  6  2  6  7   4
6   0  3  0  0 10  2  1 10  8   4
7   4  4  9 10  9  8  9  4 10   0
8   5  8  3  2  1  4  5  9  4   7
9   3  9 10  1  9  9 10  5  3   3
10  4  2  2  5  0  9  7  2  5   5

আবেদনের দরকার নেই apply। =)

সম্পাদনা

আপনার normপ্যাকেজটিও একবার দেখুন । হারিয়ে যাওয়া ডেটা বিশ্লেষণের জন্য এটিতে অনেক দুর্দান্ত বৈশিষ্ট্য রয়েছে। =)


2
আপনি এই পোস্ট করার আগে এবং কাজ না করার আগে গতকালই আমি ইতিমধ্যে এই কোডটি চেষ্টা করেছি tried কারণ এই আমি প্রশ্ন পোস্ট। তবে আমি জানার চেষ্টা করেছি এবং নিখুঁতভাবে কাজ করেছি। আমি মনে করি আমি কিছু ভুল করছি।
রেনাতো দিনহানি

12
@ রেনাটো দিনহানি কনসিওনো: আপনি যদি ইতিমধ্যে কিছু চেষ্টা করে থাকেন, আপনি যখন প্রশ্ন জিজ্ঞাসা করেন তখন সেই তথ্যটি ভাগ করে নেওয়া সহায়ক; এটি সমস্যা যেখানে হতে পারে সংকীর্ণ করতে সহায়তা করে।
অ্যারন

2
d [is.na (d)] <- 0 আমার কাছে বোঝায় না। পেছনের দিকে মনে হচ্ছে? কীভাবে এই বিবৃতিটি প্রক্রিয়া করবে?
ব্যবহারকারী 798719

13
@ ব্যবহারকারী 87৯8787১৯ - "<-" হ'ল আর এর অ্যাসাইনমেন্ট অপারেটর, এবং এটি পড়তে পারেন: ডানদিকে কিছু করুন এবং তারপরে এটিকে বামে অবস্থানে / নামটিতে বরাদ্দ করুন। এই ক্ষেত্রে, আমরা সত্যিই কিছু করছি না - কেবল শূন্য তৈরি করছি। বাম দিকটি বলছে: d অবজেক্টটি দেখুন, d অবজেক্টের (বর্গাকার বন্ধনী) ভিতরে, সমস্ত উপাদান খুঁজে বের করুন যা সত্য ফিরে আসে (is.na (d) প্রতিটি উপাদানটির জন্য একটি যৌক্তিক প্রত্যাবর্তন করে)। একবার তারা খুঁজে পাওয়া গেলে, তাদের মানটি ("তাদের নিয়োগ করুন") এর সাথে মান 0 দিয়ে প্রতিস্থাপন করুন। এটি সমস্ত নন-এনএ-তে যেমন রয়েছে তেমন, এবং কেবলমাত্র নিখোঁজের সাথে প্রতিস্থাপন করে।
টুইচ_সিটি

3
এবং ... আপনার একটি ডেটা ফ্রেম আছে এবং শুধুমাত্র নির্দিষ্ট nurmeric ভেক্টর (যাব বলুন ... এন সঙ্গে স্ট্রিং) এর প্রতিস্থাপন প্রয়োগ করতে চান যদি:df[19:28][is.na(df[19:28])] <- 0
jtdoud

298

Dplyr হাইব্রিডাইজড বিকল্পগুলি বেস আর সাবসেট পুনরায় নিয়োগের তুলনায় এখন প্রায় 30% দ্রুত। 100M ডেটাপয়েন্টে ডেটাফ্রেমটি mutate_all(~replace(., is.na(.), 0))বেস আর d[is.na(d)] <- 0বিকল্পের চেয়ে আধ সেকেন্ড দ্রুত গতিতে চলে । বিশেষত যা এড়াতে চায় তা হ'ল একটি ifelse()বা একটি ব্যবহার করা if_else()। (সম্পূর্ণ 600 ট্রায়াল বিশ্লেষণটি এই পদ্ধতির অন্তর্ভুক্তের কারণে প্রায় 4.5 ঘন্টারও বেশি সময় ধরে চলেছিল)) সম্পূর্ণ ফলাফলের জন্য নীচে বেঞ্চমার্ক বিশ্লেষণ দেখুন।

আপনি যদি বিশাল ডেটাফ্রেমগুলির সাথে লড়াই করে যাচ্ছেন data.tableতবে সবার দ্রুত বিকল্পটি হ'ল স্ট্যান্ডার্ড বেস আর পদ্ধতির চেয়ে 40% দ্রুত । এটি স্থানে থাকা ডেটা পরিবর্তন করে, কার্যকরভাবে আপনাকে একবারে প্রায় দ্বিগুণ ডেটা দিয়ে কাজ করার সুযোগ দেয়।


অন্যান্য সহায়ক পরিশ্রমী প্রতিস্থাপন পদ্ধতির একটি ক্লাস্টারিং

Locationally:

  • সূচক mutate_at(c(5:10), ~replace(., is.na(.), 0))
  • সরাসরি রেফারেন্স mutate_at(vars(var5:var10), ~replace(., is.na(.), 0))
  • স্থির ম্যাচ mutate_at(vars(contains("1")), ~replace(., is.na(.), 0))
    • বা এর জায়গায় contains(), চেষ্টা করুন ends_with(),starts_with()
  • প্যাটার্ন ম্যাচ mutate_at(vars(matches("\\d{2}")), ~replace(., is.na(.), 0))

শর্তসাপেক্ষে:
(কেবলমাত্র একক প্রকার পরিবর্তন করুন এবং অন্যান্য প্রকারকে একা ছেড়ে যান))

  • পূর্ণসংখ্যার mutate_if(is.integer, ~replace(., is.na(.), 0))
  • সংখ্যার mutate_if(is.numeric, ~replace(., is.na(.), 0))
  • স্ট্রিং mutate_if(is.character, ~replace(., is.na(.), 0))

সম্পূর্ণ বিশ্লেষণ -

Dplyr 0.8.0 এর জন্য আপডেট হয়েছে: ফাংশনগুলি purrr ফর্ম্যাট ~প্রতীক ব্যবহার করে : অবচিত funs()আর্গুমেন্টগুলি প্রতিস্থাপন করে।

পদ্ধতির পরীক্ষিত:

# Base R: 
baseR.sbst.rssgn   <- function(x) { x[is.na(x)] <- 0; x }
baseR.replace      <- function(x) { replace(x, is.na(x), 0) }
baseR.for          <- function(x) { for(j in 1:ncol(x))
    x[[j]][is.na(x[[j]])] = 0 }

# tidyverse
## dplyr
dplyr_if_else      <- function(x) { mutate_all(x, ~if_else(is.na(.), 0, .)) }
dplyr_coalesce     <- function(x) { mutate_all(x, ~coalesce(., 0)) }

## tidyr
tidyr_replace_na   <- function(x) { replace_na(x, as.list(setNames(rep(0, 10), as.list(c(paste0("var", 1:10)))))) }

## hybrid 
hybrd.ifelse     <- function(x) { mutate_all(x, ~ifelse(is.na(.), 0, .)) }
hybrd.replace_na <- function(x) { mutate_all(x, ~replace_na(., 0)) }
hybrd.replace    <- function(x) { mutate_all(x, ~replace(., is.na(.), 0)) }
hybrd.rplc_at.idx<- function(x) { mutate_at(x, c(1:10), ~replace(., is.na(.), 0)) }
hybrd.rplc_at.nse<- function(x) { mutate_at(x, vars(var1:var10), ~replace(., is.na(.), 0)) }
hybrd.rplc_at.stw<- function(x) { mutate_at(x, vars(starts_with("var")), ~replace(., is.na(.), 0)) }
hybrd.rplc_at.ctn<- function(x) { mutate_at(x, vars(contains("var")), ~replace(., is.na(.), 0)) }
hybrd.rplc_at.mtc<- function(x) { mutate_at(x, vars(matches("\\d+")), ~replace(., is.na(.), 0)) }
hybrd.rplc_if    <- function(x) { mutate_if(x, is.numeric, ~replace(., is.na(.), 0)) }

# data.table   
library(data.table)
DT.for.set.nms   <- function(x) { for (j in names(x))
    set(x,which(is.na(x[[j]])),j,0) }
DT.for.set.sqln  <- function(x) { for (j in seq_len(ncol(x)))
    set(x,which(is.na(x[[j]])),j,0) }
DT.nafill        <- function(x) { nafill(df, fill=0)}
DT.setnafill     <- function(x) { setnafill(df, fill=0)}

এই বিশ্লেষণের জন্য কোড:

library(microbenchmark)
# 20% NA filled dataframe of 10 Million rows and 10 columns
set.seed(42) # to recreate the exact dataframe
dfN <- as.data.frame(matrix(sample(c(NA, as.numeric(1:4)), 1e7*10, replace = TRUE),
                            dimnames = list(NULL, paste0("var", 1:10)), 
                            ncol = 10))
# Running 600 trials with each replacement method 
# (the functions are excecuted locally - so that the original dataframe remains unmodified in all cases)
perf_results <- microbenchmark(
    hybrid.ifelse    = hybrid.ifelse(copy(dfN)),
    dplyr_if_else    = dplyr_if_else(copy(dfN)),
    hybrd.replace_na = hybrd.replace_na(copy(dfN)),
    baseR.sbst.rssgn = baseR.sbst.rssgn(copy(dfN)),
    baseR.replace    = baseR.replace(copy(dfN)),
    dplyr_coalesce   = dplyr_coalesce(copy(dfN)),
    tidyr_replace_na = tidyr_replace_na(copy(dfN)),
    hybrd.replace    = hybrd.replace(copy(dfN)),
    hybrd.rplc_at.ctn= hybrd.rplc_at.ctn(copy(dfN)),
    hybrd.rplc_at.nse= hybrd.rplc_at.nse(copy(dfN)),
    baseR.for        = baseR.for(copy(dfN)),
    hybrd.rplc_at.idx= hybrd.rplc_at.idx(copy(dfN)),
    DT.for.set.nms   = DT.for.set.nms(copy(dfN)),
    DT.for.set.sqln  = DT.for.set.sqln(copy(dfN)),
    times = 600L
)

ফলাফল সংক্ষিপ্তসার

> print(perf_results)
Unit: milliseconds
              expr       min        lq     mean   median       uq      max neval
      hybrd.ifelse 6171.0439 6339.7046 6425.221 6407.397 6496.992 7052.851   600
     dplyr_if_else 3737.4954 3877.0983 3953.857 3946.024 4023.301 4539.428   600
  hybrd.replace_na 1497.8653 1706.1119 1748.464 1745.282 1789.804 2127.166   600
  baseR.sbst.rssgn 1480.5098 1686.1581 1730.006 1728.477 1772.951 2010.215   600
     baseR.replace 1457.4016 1681.5583 1725.481 1722.069 1766.916 2089.627   600
    dplyr_coalesce 1227.6150 1483.3520 1524.245 1519.454 1561.488 1996.859   600
  tidyr_replace_na 1248.3292 1473.1707 1521.889 1520.108 1570.382 1995.768   600
     hybrd.replace  913.1865 1197.3133 1233.336 1238.747 1276.141 1438.646   600
 hybrd.rplc_at.ctn  916.9339 1192.9885 1224.733 1227.628 1268.644 1466.085   600
 hybrd.rplc_at.nse  919.0270 1191.0541 1228.749 1228.635 1275.103 2882.040   600
         baseR.for  869.3169 1180.8311 1216.958 1224.407 1264.737 1459.726   600
 hybrd.rplc_at.idx  839.8915 1189.7465 1223.326 1228.329 1266.375 1565.794   600
    DT.for.set.nms  761.6086  915.8166 1015.457 1001.772 1106.315 1363.044   600
   DT.for.set.sqln  787.3535  918.8733 1017.812 1002.042 1122.474 1321.860   600

ফলাফলের বক্সপ্লট lot

ggplot(perf_results, aes(x=expr, y=time/10^9)) +
    geom_boxplot() +
    xlab('Expression') +
    ylab('Elapsed Time (Seconds)') +
    scale_y_continuous(breaks = seq(0,7,1)) +
    coord_flip()

বিলম্বিত সময়ের সাথে বক্সপ্লোটের তুলনা

ট্রায়ালের রঙ-কোডিং স্কেটারপ্ল্লট (লগ স্কেলে y- অক্ষ সহ)

qplot(y=time/10^9, data=perf_results, colour=expr) + 
    labs(y = "log10 Scaled Elapsed Time per Trial (secs)", x = "Trial Number") +
    coord_cartesian(ylim = c(0.75, 7.5)) +
    scale_y_log10(breaks=c(0.75, 0.875, 1, 1.25, 1.5, 1.75, seq(2, 7.5)))

সমস্ত ট্রায়াল টাইমসের স্ক্যাটারপ্ল্লট

অন্যান্য উচ্চ অভিনেতা সম্পর্কে একটি নোট

যখন ডেটাসেটগুলি বড় হয়, টিডির s তিহাসিকভাবেreplace_na সামনে টেনে নিয়ে যায়। চলার জন্য 100M ডেটা পয়েন্টের বর্তমান সংগ্রহের সাথে, এটি লুপের জন্য প্রায় বেইস আর পাশাপাশি কার্য সম্পাদন করে । বিভিন্ন আকারের ডেটাফ্রেমগুলির জন্য কী ঘটে তা আমি জানতে আগ্রহী।

mutateএবং summarize _atএবং _allফাংশন বৈকল্পিকগুলির জন্য অতিরিক্ত উদাহরণগুলি এখানে পাওয়া যাবে: https://rdrr.io/cran/dplyr/man/summarise_all.html অতিরিক্তভাবে, আমি এখানে সহায়ক বিক্ষোভ এবং উদাহরণগুলির সংগ্রহগুলি এখানে পেয়েছি : https: //blog.explotory। IO / dplyr-0-5-is-সন্ত্রস্ত-হেরস নামে-কেন-be095fd4eb8a

গুণাবলী এবং প্রশংসা

বিশেষ ধন্যবাদ সাথে:

  • মাইক্রোব্যাঙ্কমার্ক প্রদর্শনের জন্য টাইলার রিঙ্কার এবং আকরুন।
  • এ্যালেক্সিস_লাজ আমাকে ব্যবহার সম্পর্কে বুঝতে সাহায্য করার জন্য কাজ করার জন্য local(), এবং (ফ্র্যাঙ্কের রোগীর সাহায্যেও) এই ধরণের অনেক পদ্ধতির গতি বাড়ানোর ক্ষেত্রে নীরব জবরদস্তির ভূমিকা পালন করে।
  • আর্থারওয়াইপ পোকার জন্য নতুন coalesce()ফাংশন যুক্ত করতে এবং বিশ্লেষণ আপডেট করতে।
  • data.tableশেষ পর্যন্ত লাইনআপে তাদের অন্তর্ভুক্ত করার জন্য ফাংশনগুলি ভালভাবে খুঁজে বের করার জন্য গ্রেগর ।
  • লুপের জন্য বেস আর : অ্যালেক্সিস_লাজ
  • লুপগুলির জন্য ডেটা.ট্যাবল : ম্যাট_ডভল
  • is.numeric()আসলে পরীক্ষা করে বোঝানোর জন্য রোমান ।

(অবশ্যই, আপনি যদি এই পদ্ধতিগুলিকে দরকারী মনে করেন তবে দয়া করে পৌঁছে যান এবং সেগুলি উপস্থাপন করুন))

আমার সংখ্যাগুলির ব্যবহার সম্পর্কে দ্রষ্টব্য: আপনার যদি খাঁটি পূর্ণসংখ্যার ডেটাসেট থাকে তবে আপনার সমস্ত ফাংশন দ্রুত চলে। আরও তথ্যের জন্যদয়া করে অলেক্সিজ_লাজের কাজ দেখুন। আইআরএল, আমি 10-15% এর বেশি পূর্ণসংখ্যার সমন্বিত কোনও ডেটা সেটটির মুখোমুখি হতে পারি না, তাই আমি এই পরীক্ষাগুলি সম্পূর্ণরূপে সংখ্যাসূচক ডেটাফ্রেমে চালাচ্ছি।

24 জিবি র‌্যাম সহ হার্ডওয়্যার ব্যবহৃত 3.9 গিগাহার্টজ সিপিইউ


2
@ ফ্র্যাঙ্ক - এই তাত্পর্য খুঁজে পাওয়ার জন্য আপনাকে ধন্যবাদ। তথ্যসূত্রগুলি সমস্ত পরিষ্কার হয়ে গেছে এবং ফলাফলগুলি সম্পূর্ণরূপে একটি একক মেশিনে পুনরায় চালিত হয়েছে এবং পুনরায় পোস্ট করা হয়েছে।
Leerssej

ঠিক আছে ধন্যবাদ. এছাড়াও, আমি মনে করি df1[j][is.na(df1[j])] = 0ভুল হয়েছে, হওয়া উচিতdf1[[j]][is.na(df1[[j]])] = 0
ফ্রাঙ্ক

ওহ এখন আমি দেখছি আপনি এটি দুটি বার লিখেছেন, প্রতিটি বেঞ্চমার্কে আলাদা। যাইহোক, forLp_Sbstমনে হয় না যে কারও কাছে এটির কাছে আসা বিবেচনা করা উচিতforLp_smplfSbst
ফ্রেঞ্চ

1
@ উওব্লক - দুর্দান্ত প্রশ্ন: এটি আমাকে একই ডাটাফ্রেমের সাথে কাজ করে সমস্ত ফাংশন সহ সাবসেটিং বাম এসাইন্ট অপারেশন করতে দেয়। যেহেতু আমাকে সেই ফাংশনটির চারপাশে লোকালটি আবদ্ধ করতে হয়েছিল, তখন বিজ্ঞানের নামে [একটি কাজ, আপনার একটি কাজ ছিল!] আমি এগুলি সমস্তটির চারপাশে জড়িয়ে রেখেছি যাতে খেলার ক্ষেত্রটি দ্বিধাদ্বন্দ্বের পর্যায়ে থাকে। আরও তথ্যের জন্য - দয়া করে এখানে দেখুন: stackoverflow.com/questions/41604711/… আমি বরং দীর্ঘায়িত পূর্ববর্তী উত্তরটি ছাঁটাই করেছি - তবে আলোচনার সেই অংশটি আবার যুক্ত করা ভাল Thank ধন্যবাদ!
লেয়ারসেজ

1
@ আর্থারইপ - আমি coalesce()বিকল্পটি যোগ করে দিয়েছি এবং সর্বদা পুনরায় চালাচ্ছি । আপডেটটি দেওয়ার জন্য আপনাকে ধন্যবাদ
লিয়ারসেজ

128

একক ভেক্টরের জন্য:

x <- c(1,2,NA,4,5)
x[is.na(x)] <- 0

ডেটা.ফ্রেমের জন্য, উপরের থেকে কোনও ফাংশন তৈরি করুন, তারপরে applyএটি কলামগুলিতে।

এখানে বিস্তারিত হিসাবে দয়া করে পরের বার একটি পুনরায় উত্পাদনযোগ্য উদাহরণ সরবরাহ করুন:

কিভাবে একটি দুর্দান্ত আর প্রজননযোগ্য উদাহরণ তৈরি করতে হয়?


18
is.naজেনেরিক ফাংশন, এবং data.frameশ্রেণীর অবজেক্টগুলির জন্য পদ্ধতি রয়েছে । সুতরাং এই এক এছাড়াও কাজ করবে data.frame!
aL3xa

3
আমি যখন methods(is.na)প্রথমবারের জন্য দৌড়ালাম, তখন আমি কি ওয়াহার মতো ছিলাম?!? । আমি পছন্দ করি যখন এমন জিনিস ঘটে! =)
এএল

9
ধরুন আপনার কাছে একটি ভেক্টরের পরিবর্তে ডিএফ নামের একটি ডেটা ফ্রেম রয়েছে এবং আপনি কেবল এক্স 3 নামের একক কলামে অনুপস্থিত পর্যবেক্ষণগুলি প্রতিস্থাপন করতে চান। আপনি এই লাইনটি দিয়ে এটি করতে পারেন: ডিএফ $ এক্স 3 [is.na (df $ X3)] <- 0
মার্ক মিলার

8
মনে করুন আপনি কেবল my.df নামক একটি ডেটা ফ্রেমের 4-6 কলামে এনএ প্রতিস্থাপন করতে চান want আপনি ব্যবহার করতে পারেন: my.df [, 4: 6] [is.na (my.df [, 4: 6])] <- 0
মার্ক মিলার

আপনি কীভাবে 'x' কে is.na (x) এ পাস করবেন সেখানে কীভাবে কোনও লাইব্রেরির রুটিনগুলি ভেক্টরাইজড তা বলার উপায় আছে?
uh_big_mike_boi

73

dplyr উদাহরণ:

library(dplyr)

df1 <- df1 %>%
    mutate(myCol1 = if_else(is.na(myCol1), 0, myCol1))

দ্রষ্টব্য: এটি নির্বাচিত কলাম অনুসারে কাজ করে, যদি আমাদের সমস্ত কলামের জন্য এটি করা দরকার হয় তবে @reidjax এর উত্তরটি mutate_each ব্যবহার করে দেখুন


57

আমরা যদি NAরফতানির সময় s এর প্রতিস্থাপনের চেষ্টা করি , উদাহরণস্বরূপ সিএসভিতে লেখার সময়, তবে আমরা ব্যবহার করতে পারি:

  write.csv(data, "data.csv", na = "0")

47

আমি জানি প্রশ্নের ইতিমধ্যে উত্তর দেওয়া হয়েছে, তবে এটি এভাবে করা কারও কারও পক্ষে আরও কার্যকর হতে পারে:

এই ফাংশনটি সংজ্ঞায়িত করুন:

na.zero <- function (x) {
    x[is.na(x)] <- 0
    return(x)
}

এখন যখনই আপনাকে এনএ'র কোনও ভেক্টরকে শূন্যের রূপান্তর করতে হবে আপনি তা করতে পারেন:

na.zero(some.vector)

22

সঙ্গে dplyr0.5.0, আপনি ব্যবহার করতে পারেন coalesceফাংশন যা খুব সহজেই একত্রিত করা যেতে পারে %>%করে পাইপলাইন coalesce(vec, 0)। এটি সমস্ত এনএ-কে প্রতিস্থাপন করেvec 0 সাথে :

বলুন আমাদের সাথে একটি ডেটা ফ্রেম রয়েছে NA:

library(dplyr)
df <- data.frame(v = c(1, 2, 3, NA, 5, 6, 8))

df
#    v
# 1  1
# 2  2
# 3  3
# 4 NA
# 5  5
# 6  6
# 7  8

df %>% mutate(v = coalesce(v, 0))
#   v
# 1 1
# 2 2
# 3 3
# 4 0
# 5 5
# 6 6
# 7 8

আমি কোলেসেস পরীক্ষা করেছি এবং এটি প্রতিস্থাপনের মতোই সম্পাদন করে। coalesce কমান্ড এখন পর্যন্ত সবচেয়ে সহজ!
আর্থার ইপ

2+ কলামের সমস্ত কলাম টিবিলে কীভাবে এটি প্রয়োগ করতে হয় তা উপস্থাপন করলে এটি কার্যকর হবে।
জাঙ্গোরেকি

21

replace()প্রতিস্থাপনের NAজন্য ম্যাট্রিক্স বা ভেক্টর ব্যবহারের আরও সাধারণ পদ্ধতির0

উদাহরণ স্বরূপ:

> x <- c(1,2,NA,NA,1,1)
> x1 <- replace(x,is.na(x),0)
> x1
[1] 1 2 0 0 1 1

এই ব্যবহার করে একটি বিকল্প ifelse()মধ্যেdplyr

df = data.frame(col = c(1,2,NA,NA,1,1))
df <- df %>%
   mutate(col = replace(col,is.na(col),0))

1
আমার কলামটি একটি ফ্যাক্টর ছিল তাই আমাকে আমার প্রতিস্থাপনের মানটি যুক্ত করতে হয়েছিলlevels(A$x) <- append(levels(A$x), "notAnswered") A$x <- replace(A$x,which(is.na(A$x)),"notAnswered")
ক্লাইমস_লিকা_স্পিডার

1
whichএখানে প্রয়োজন নেই, আপনি ব্যবহার করতে পারেন x1 <- replace(x,is.na(x),1)
lmo

আমি এই থ্রেডে প্রস্তাবিত অনেকগুলি উপায়ে একটি বৃহত ডেটা ফ্রেমে কেবল একটি নির্দিষ্ট কলামে প্রতিস্থাপন NAকরতে চেষ্টা করেছি 0এবং এই ফাংশনটি replace()সবচেয়ে কার্যকরভাবে কাজ করেছে যখন সবচেয়ে সহজও।
ডুক

19

এটি ব্যবহার করাও সম্ভব tidyr::replace_na

    library(tidyr)
    df <- df %>% mutate_all(funs(replace_na(.,0)))

9

ইমপুটটিএস প্যাকেজ ব্যবহার করে অন্য একটি উদাহরণ :

library(imputeTS)
na.replace(yourDataframe, 0)

9

আপনি যদি ফ্যাক্টর ভেরিয়েবলগুলিতে এনএগুলি প্রতিস্থাপন করতে চান তবে এটি কার্যকর হতে পারে:

n <- length(levels(data.vector))+1

data.vector <- as.numeric(data.vector)
data.vector[is.na(data.vector)] <- n
data.vector <- as.factor(data.vector)
levels(data.vector) <- c("level1","level2",...,"leveln", "NAlevel") 

এটি একটি ফ্যাক্টর-ভেক্টরকে একটি সাংখ্যিক ভেক্টরে রূপান্তরিত করে এবং আর্টিফিকাল সংখ্যার ফ্যাক্টর স্তর যুক্ত করে, যা আপনার পছন্দের একটি অতিরিক্ত "এনএ-স্তর" দিয়ে ফ্যাক্টর-ভেক্টরে ফিরে রূপান্তরিত হয়।


8

@ আইয়ানমুনোজ পোস্টে মন্তব্য করতাম তবে আমার যথেষ্ট খ্যাতি নেই। আপনি একত্রিত করতে পারেন dplyr'গুলি mutate_eachএবং replaceযত্ন নিতে NAকরার 0প্রতিস্থাপন। @ AL3xa এর উত্তর থেকে ডেটাফ্রেম ব্যবহার করা হচ্ছে ...

> m <- matrix(sample(c(NA, 1:10), 100, replace = TRUE), 10)
> d <- as.data.frame(m)
> d

    V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1   4  8  1  9  6  9 NA  8  9   8
2   8  3  6  8  2  1 NA NA  6   3
3   6  6  3 NA  2 NA NA  5  7   7
4  10  6  1  1  7  9  1 10  3  10
5  10  6  7 10 10  3  2  5  4   6
6   2  4  1  5  7 NA NA  8  4   4
7   7  2  3  1  4 10 NA  8  7   7
8   9  5  8 10  5  3  5  8  3   2
9   9  1  8  7  6  5 NA NA  6   7
10  6 10  8  7  1  1  2  2  5   7

> d %>% mutate_each( funs_( interp( ~replace(., is.na(.),0) ) ) )

    V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1   4  8  1  9  6  9  0  8  9   8
2   8  3  6  8  2  1  0  0  6   3
3   6  6  3  0  2  0  0  5  7   7
4  10  6  1  1  7  9  1 10  3  10
5  10  6  7 10 10  3  2  5  4   6
6   2  4  1  5  7  0  0  8  4   4
7   7  2  3  1  4 10  0  8  7   7
8   9  5  8 10  5  3  5  8  3   2
9   9  1  8  7  6  5  0  0  6   7
10  6 10  8  7  1  1  2  2  5   7

আমরা এখানে স্ট্যান্ডার্ড মূল্যায়ন (এসই) ব্যবহার করছি যার জন্য আমাদের "উপরের আন্ডারস্কোর প্রয়োজন funs_।" এছাড়া আমরা lazyevalএর interp/ ~এবং .রেফারেন্স, অর্থাত্ ডাটা ফ্রেম "সবকিছু আমরা সাথে কাজ করেন,"। এখন শূন্য আছে!


4

তুমি ব্যবহার করতে পার replace()

উদাহরণ স্বরূপ:

> x <- c(-1,0,1,0,NA,0,1,1)
> x1 <- replace(x,5,1)
> x1
[1] -1  0  1  0  1  0  1  1

> x1 <- replace(x,5,mean(x,na.rm=T))
> x1
[1] -1.00  0.00  1.00  0.00  0.29  0.00 1.00  1.00

6
সত্য, তবে কেবল ব্যবহারিক যখন আপনি NAআপনার ভেক্টরের সূচকগুলি জানেন। এটি আপনার উদাহরণের মতো ছোট ভেক্টরদের জন্যও ঠিক।
দারডিসকো

4
@ ডারডিসকো x1 <- replace(x,is.na(x),1)সূচীর মানগুলি সুস্পষ্টভাবে তালিকাভুক্ত না করে কাজ করবে।
lmo

4

পদ্ধতি dplyrসহ আরও একটি পাইপ সামঞ্জস্যপূর্ণ বিকল্প যা বেশ কয়েকটি কলামের জন্য কাজ করে:tidyrreplace_na

require(dplyr)
require(tidyr)

m <- matrix(sample(c(NA, 1:10), 100, replace = TRUE), 10)
d <- as.data.frame(m)

myList <- setNames(lapply(vector("list", ncol(d)), function(x) x <- 0), names(d))

df <- d %>% replace_na(myList)

আপনি সহজে সীমাবদ্ধ করতে পারেন যেমন সংখ্যার কলামগুলি:

d$str <- c("string", NA)

myList <- myList[sapply(d, is.numeric)]

df <- d %>% replace_na(myList)

4

এই উদ্দেশ্যে ডেডিকেটেড ফাংশন ( nafill/ setnafill) সাম্প্রতিক data.tableসংস্করণে রয়েছে

install.packages("data.table", repos="https://Rdatatable.gitlab.io/data.table")
library(data.table)
ans_df = nafill(df, fill=0)
setnafill(df, fill=0) # this one updates in-place

যারা নিম্নগামী, তাদের জন্য দয়া করে প্রতিক্রিয়াও সরবরাহ করুন, যাতে আমার উত্তরটি উন্নত হতে পারে।
জাঙ্গোরেকি

3

ডেটাচ্যাম্প থেকে আহৃত এই সাধারণ ফাংশনটি সাহায্য করতে পারে:

replace_missings <- function(x, replacement) {
  is_miss <- is.na(x)
  x[is_miss] <- replacement

  message(sum(is_miss), " missings replaced by the value ", replacement)
  x
}

তারপর

replace_missings(df, replacement = 0)

3

একটি সহজ উপায় এটা লিখতে সাথে আছেন if_naথেকে hablar:

library(dplyr)
library(hablar)

df <- tibble(a = c(1, 2, 3, NA, 5, 6, 8))

df %>% 
  mutate(a = if_na(a, 0))

যা প্রত্যাবর্তন করে:

      a
  <dbl>
1     1
2     2
3     3
4     0
5     5
6     6
7     8

2

একটি ডেটা ফ্রেমে সমস্ত এনএ প্রতিস্থাপন করতে আপনি ব্যবহার করতে পারেন:

df %>% replace(is.na(.), 0)


এটি কোনও নতুন সমাধান নয়
জাগো

1

আপনি যদি এই কেস কলাম V3 এর একটি নির্দিষ্ট কলামে এনএগুলি পরিবর্তন করার পরে কোনও নতুন নাম নির্ধারণ করতে চান তবে আপনি এটিও করতে পারেন ব্যবহার করুন

my.data.frame$the.new.column.name <- ifelse(is.na(my.data.frame$V3),0,1)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.