ডেটা.ফ্রেমে একটি কলাম যুক্ত করা হচ্ছে


115

আমার নিচে ডেটা ফ্রেম রয়েছে। আমি একটি কলাম যুক্ত করতে চাই যা কলাম 1 ( h_no) অনুযায়ী আমার ডেটা শ্রেণিবদ্ধ করে যে h_no 1,2,3,4 এর প্রথম সিরিজটি ক্লাস 1, দ্বিতীয় সিরিজের h_no(1 থেকে 7) শ্রেণি 2 ইত্যাদি etc. যেমন শেষ কলামে নির্দেশিত।

h_no  h_freq  h_freqsq
1     0.09091 0.008264628 1
2     0.00000 0.000000000 1
3     0.04545 0.002065702 1
4     0.00000 0.000000000 1  
1     0.13636 0.018594050 2
2     0.00000 0.000000000 2
3     0.00000 0.000000000 2
4     0.04545 0.002065702 2
5     0.31818 0.101238512 2
6     0.00000 0.000000000 2
7     0.50000 0.250000000 2 
1     0.13636 0.018594050 3 
2     0.09091 0.008264628 3
3     0.40909 0.167354628 3
4     0.04545 0.002065702 3

উত্তর:


155

আপনি বিভিন্ন কৌশল ব্যবহার করে আপনার ডেটাতে একটি কলাম যুক্ত করতে পারেন। নীচের উদ্ধৃতিগুলি প্রাসঙ্গিক সহায়তা পাঠ্যের "বিশদ" বিভাগ থেকে আসে [[.data.frame

ডেটা ফ্রেমগুলি বেশ কয়েকটি মোডে সূচিযুক্ত হতে পারে। যখন [এবং [[একটি একক ভেক্টর সূচক ( x[i]বা x[[i]]) ব্যবহার করা হয় তখন তারা ডেটা ফ্রেমটিকে সূচি দিয়ে থাকে যেন এটি কোনও তালিকা।

my.dataframe["new.col"] <- a.vector
my.dataframe[["new.col"]] <- a.vector

এর জন্য ডেটা.ফ্রেম পদ্ধতিটি তালিকা হিসাবে $বিবেচনা করেx

my.dataframe$new.col <- a.vector

যখন [এবং [[দুটি সূচক ( x[i, j]এবং x[[i, j]]) ব্যবহার করা হয় তখন তারা ম্যাট্রিক্সকে সূচকের মতো কাজ করে

my.dataframe[ , "new.col"] <- a.vector

যেহেতু এই পদ্ধতিটি data.frameধরে নেওয়া হয়েছে যে আপনি কলাম বা সারিগুলির সাথে কাজ করছেন কিনা তা যদি আপনি নির্দিষ্ট না করেন তবে এটি ধরে নেবে আপনার কলামগুলি বোঝায়।


আপনার উদাহরণস্বরূপ, এটি কাজ করা উচিত:

# make some fake data
your.df <- data.frame(no = c(1:4, 1:7, 1:5), h_freq = runif(16), h_freqsq = runif(16))

# find where one appears and 
from <- which(your.df$no == 1)
to <- c((from-1)[-1], nrow(your.df)) # up to which point the sequence runs

# generate a sequence (len) and based on its length, repeat a consecutive number len times
get.seq <- mapply(from, to, 1:length(from), FUN = function(x, y, z) {
            len <- length(seq(from = x[1], to = y[1]))
            return(rep(z, times = len))
         })

# when we unlist, we get a vector
your.df$group <- unlist(get.seq)
# and append it to your original data.frame. since this is
# designating a group, it makes sense to make it a factor
your.df$group <- as.factor(your.df$group)


   no     h_freq   h_freqsq group
1   1 0.40998238 0.06463876     1
2   2 0.98086928 0.33093795     1
3   3 0.28908651 0.74077119     1
4   4 0.10476768 0.56784786     1
5   1 0.75478995 0.60479945     2
6   2 0.26974011 0.95231761     2
7   3 0.53676266 0.74370154     2
8   4 0.99784066 0.37499294     2
9   5 0.89771767 0.83467805     2
10  6 0.05363139 0.32066178     2
11  7 0.71741529 0.84572717     2
12  1 0.10654430 0.32917711     3
13  2 0.41971959 0.87155514     3
14  3 0.32432646 0.65789294     3
15  4 0.77896780 0.27599187     3
16  5 0.06100008 0.55399326     3

কলাম যুক্ত করার শেষ দুটি পদ্ধতির মধ্যে পার্থক্য কী?
Huon

2
@ হুন-ডাবউপ কমা সহ পদ্ধতিটি সুস্পষ্ট এবং ম্যাট্রিকগুলিতেও কাজ করবে, যখন শেষটি কেবল ডেটা.ফ্রেমে কাজ করে। যদি কোনও কমা সরবরাহ করা হয় না, তখন ধরে নেওয়া হয়েছে যে আপনি কলামগুলি বোঝাতে চাইছেন।
রোমান Luštrik

12

সহজেই: আপনার ডেটা ফ্রেমটি এ

b <- A[,1]
b <- b==1
b <- cumsum(b)

তারপরে আপনি কলামটি পাবেন বি।


সুন্দর এবং সংক্ষিপ্ত। আমি কেবলমাত্র সর্বশেষ উপাদানটি পরিবর্তন করব যাতে cumsum(b) -> bফলাফল না হয়ে সরাসরি সরাসরি মূল ডেটা ফ্রেমে কলাম হিসাবে যুক্ত করা যায়, এর মতো কিছু A$groups <- cumsum(b)
A5C1D2H2I1M1N2O1R2T1

cumsum(b)আপনি 3 দৈর্ঘ্যের একটি ভেক্টর দেবেন, বা আমি কিছু মিস করছি?
রোমান Luštrik

@ রোমানলুথ্রিক, ডিবাউপের সমাধান দেখুন যা এই ক্ষেত্রে কীমসাম কাজ করবে তা ব্যাখ্যা করে।
A5C1D2H2I1M1N2O1R2T1

2
@ রোমানলুয়েট্রিক, এই সমাধানটি একটি লাইনে সত্যিই খুব সুন্দর করে আবার লেখা যেতে পারে। আপনার your.dfডেটা ব্যবহার করে, আপনি কেবল your.df$group = cumsum(your.df[, 1]==1)নিজের নতুন গ্রুপ কলামটি পেতে পারেন ।
A5C1D2H2I1M1N2O1R2T1

7

যদি আমি প্রশ্নটি সঠিকভাবে বুঝতে পারি তবে আপনি কখন h_noবাড়াবেন না তা সনাক্ত করতে এবং তারপরে বৃদ্ধি করতে চান class। (আমি কীভাবে এই সমস্যাটি সমাধান করেছি তার মধ্য দিয়ে চলতে চলেছি, শেষে একটি স্বনির্ভর ফাংশন রয়েছে))

ওয়ার্কিং

আমরা কেবল h_noমুহুর্তের জন্য কলামটি যত্ন করি, তাই আমরা এটি ডেটা ফ্রেম থেকে বের করতে পারি:

> h_no <- data$h_no

h_noক্রমবর্ধমান উপাদানগুলির মধ্যে পার্থক্য হয় negativeণাত্মক বা শূন্য হয় যখন আমরা কাজ না করে যা করতে পারি তা আমরা সনাক্ত করতে চাই । আর diffফাংশন সরবরাহ করে যা আমাদের পার্থক্যের ভেক্টর দেয়:

> d.h_no <- diff(h_no)
> d.h_no
 [1]  1  1  1 -3  1  1  1  1  1  1 -6  1  1  1

আমাদের এটি একবার হয়ে গেলে, ইতিবাচক নয় এমনগুলি খুঁজে পাওয়া সহজ বিষয়:

> nonpos <- d.h_no <= 0
> nonpos
 [1] FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
[13] FALSE FALSE

আর-তে, TRUEএবং FALSEমূলত একইরূপে 1এবং 0তাই, আমরা যদি সংখ্যার যোগফল পাই nonpos, তবে এটি উপযুক্ত স্পটগুলিতে (প্রায়) 1-এ বাড়বে। cumsumফাংশন (যা মূলত বিপরীত diff) এটা করতে পারেন।

> cumsum(nonpos)
 [1] 0 0 0 1 1 1 1 1 1 1 2 2 2 2

তবে, দুটি সমস্যা আছে: সংখ্যাগুলি খুব কম; এবং, আমরা প্রথম উপাদানটি মিস করছি (প্রথম শ্রেণিতে চারটি হওয়া উচিত)।

প্রথম সমস্যা সহজভাবে সমাধান হয়: 1+cumsum(nonpos)। এবং দ্বিতীয়টির জন্য কেবল 1ভেক্টরের সামনের অংশে একটি যুক্ত করা প্রয়োজন , যেহেতু প্রথম উপাদানটি সর্বদা ক্লাসে থাকে 1:

 > classes <- c(1, 1 + cumsum(nonpos))
 > classes
  [1] 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3

এখন, আমরা এটি দিয়ে আমাদের ডেটা ফ্রেমে আবার সংযুক্ত করতে পারি cbind( class=সিনট্যাক্স ব্যবহার করে আমরা কলামটি classশিরোনাম দিতে পারি ):

 > data_w_classes <- cbind(data, class=classes)

এবং data_w_classesএখন ফলাফল রয়েছে।

সর্বশেষ ফলাফল

আমরা লাইনগুলি একসাথে সংকুচিত করতে পারি এবং এটির ব্যবহার আরও সহজ করার জন্য এটি সমস্ত একটি ফাংশনে গুটিয়ে রাখতে পারি:

classify <- function(data) {
   cbind(data, class=c(1, 1 + cumsum(diff(data$h_no) <= 0)))
}

বা, যেহেতু এটি classএকটি ফ্যাক্টর হিসাবে বোধগম্য হয় :

classify <- function(data) {
   cbind(data, class=factor(c(1, 1 + cumsum(diff(data$h_no) <= 0))))
}

আপনি হয় ফাংশন যেমন ব্যবহার করুন:

> classified <- classify(data) # doesn't overwrite data
> data <- classify(data) # data now has the "class" column

(এই সমস্যা সমাধানের এই পদ্ধতিটি ভাল কারণ এটি স্পষ্টভাবে পুনরাবৃত্তি এড়িয়ে চলে, যা সাধারণত আর এর জন্য সুপারিশ করা হয়, এবং প্রচুর মধ্যবর্তী ভেক্টর এবং তালিকা তৈরি করা এড়ানো হয় এবং এছাড়াও এটি কীভাবে এক লাইনে লিখিত হতে পারে তা খুব সুন্দর :))


2

রোমানের উত্তর ছাড়াও এর মতো কিছু আরও সহজ হতে পারে। মনে রাখবেন যে আমি এখনই এটির আরে অ্যাক্সেস পাচ্ছি না বলে এটি পরীক্ষা করে দেখিনি।

# Note that I use a global variable here
# normally not advisable, but I liked the
# use here to make the code shorter
index <<- 0
new_column = sapply(df$h_no, function(x) {
  if(x == 1) index = index + 1
  return(index)
})

ফাংশনটি মানগুলির মধ্যে পুনরাবৃত্তি করে n_hoএবং সর্বদা বর্তমান মানটির সাথে সম্পর্কিত শ্রেণীবদ্ধটি প্রদান করে। যদি এর কোনও মান 1সনাক্ত হয়, আমরা গ্লোবাল ভেরিয়েবল বৃদ্ধি করি indexএবং চালিয়ে যাই ।


আমি গ্লোবাল ভেরিয়েবলের সাথে হ্যাক পছন্দ করি। তাই Cish। : পি
রোমান Luštrik

2

আমি বিশ্বাস করি যে "সিবাইন্ড" ব্যবহার করা আর-এ কোনও ডাটা ফ্রেমে কলাম যুক্ত করার সহজতম উপায় an উদাহরণের নীচে:

    myDf = data.frame(index=seq(1,10,1), Val=seq(1,10,1))
    newCol= seq(2,20,2)
    myDf = cbind(myDf,newCol)


0

গোষ্ঠীগুলির সংখ্যা ( xএর mapply) এবং এর দৈর্ঘ্য ( yইন mapply) সনাক্ত করার উপর ভিত্তি করে

mytb<-read.table(text="h_no  h_freq  h_freqsq group
1     0.09091 0.008264628 1
2     0.00000 0.000000000 1
3     0.04545 0.002065702 1
4     0.00000 0.000000000 1  
1     0.13636 0.018594050 2
2     0.00000 0.000000000 2
3     0.00000 0.000000000 2
4     0.04545 0.002065702 2
5     0.31818 0.101238512 2
6     0.00000 0.000000000 2
7     0.50000 0.250000000 2 
1     0.13636 0.018594050 3 
2     0.09091 0.008264628 3
3     0.40909 0.167354628 3
4     0.04545 0.002065702 3", header=T, stringsAsFactors=F)
mytb$group<-NULL

positionsof1s<-grep(1,mytb$h_no)

mytb$newgroup<-unlist(mapply(function(x,y) 
  rep(x,y),                      # repeat x number y times
  x= 1:length(positionsof1s),    # x is 1 to number of nth group = g1:g3
  y= c( diff(positionsof1s),     # y is number of repeats of groups g1 to penultimate (g2) = 4, 7
        nrow(mytb)-              # this line and the following gives number of repeat for last group (g3)
          (positionsof1s[length(positionsof1s )]-1 )  # number of rows - position of penultimate group (g2) 
      ) ) )
mytb
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.