ডেটা.ফ্রেমে দুটি কলামের মধ্যে একটি কলাম যুক্ত করুন (সন্নিবেশ করুন)


89

আমার কাছে একটি ডেটা ফ্রেম রয়েছে যাতে ক, ক এবং ক কলাম রয়েছে। আমি খ এবং গ এর মধ্যে একটি নতুন কলাম যুক্ত করতে চাই।

আমি শুধু ব্যবহার করে শেষে ঘ যোগ করতে পারিনি জানি cbind কিন্তু কিভাবে আমি করতে পারেন সন্নিবেশ দুটি কলাম মধ্যে এটা?


সম্ভবত এটি আপনি যা চান তা করতে পারে: r.789695.n4.nabble.com/…
মার্ক মিলার

4
dplyr প্যাকেজে মুউটেট () ফাংশনটি এই প্রশ্নে বর্ণিত কলামগুলি যুক্ত করতে দেয়?
মার্বেল

উত্তর:


83

আমি আপনাকে প্যাকেজ add_column()থেকে ফাংশনটি ব্যবহার করার পরামর্শ দিচ্ছি tibble

library(tibble)
dataset <- data.frame(a = 1:5, b = 2:6, c=3:7)
add_column(dataset, d = 4:8, .after = 2)

মনে রাখবেন যে আপনি কলাম সূচীর পরিবর্তে কলামের নাম ব্যবহার করতে পারেন:

add_column(dataset, d = 4:8, .after = "b")

অথবা আরও সুবিধাজনক হলে .beforeপরিবর্তে যুক্তি ব্যবহার করুন .after

add_column(dataset, d = 4:8, .before = "c")

6
নাম বাদ দেওয়া সরিয়েছি। অনেক যোগ করার জন্য বলে মনে না হয় এবং যখন হ্যাডলি হিসেবে তালিকাভুক্ত করা হয় একটি প্যাকেজ কিরিল নোড়া লেখক হিসেবে তালিকাভুক্ত করা হয় স্রষ্টা এবং রক্ষণাবেক্ষণকারী
গ্রেগোর টমাস

39

আপনার নতুন কলামে যুক্ত করুন:

df$d <- list/data

তারপরে আপনি সেগুলি পুনরায় অর্ডার করতে পারেন।

df <- df[, c("a", "b", "d", "c")]

4
আমি setcolorderকলাম নম্বরগুলির সাথে মিলিতভাবে (তাদের নামগুলির বিপরীতে) ব্যবহার করেও খুব দরকারী হতে পেলাম , কারণ কলামগুলির সংখ্যা খুব বড় হয়ে যাওয়ার পরে আপনি বেশিরভাগ কাজ শুরু করতে seqএবং শুরু করতে পারেন rep। প্লাস গণিত অপারেটর ব্যবহার করা যেতে পারে। উদাহরণস্বরূপsetcolorder(data, c(1, (num_cols -2), (num_cols -1), num_cols, seq(from = 2, to = (num_cols - 3))))
n1k31t4

4
আমার উল্লেখ করা উচিত, setcolorderডেটা টেবিলের জন্য বোঝানো হয়, ডেটাফ্রেম নয়!
n1k31t4

21

আপনি [, বা কলামগুলি আপনার পছন্দ অনুযায়ী ক্রম উপস্থাপন করতে কলামগুলি পুনরায় অর্ডার করতে পারেন।

d <- data.frame(a=1:4, b=5:8, c=9:12)
target <- which(names(d) == 'b')[1]
cbind(d[,1:target,drop=F], data.frame(d=12:15), d[,(target+1):length(d),drop=F])

  a b  d  c
1 1 5 12  9
2 2 6 13 10
3 3 7 14 11
4 4 8 15 12

13
এটি একটি দুর্দান্ত উত্তর। তবে আমাকে স্বীকার করতে হবে, এটি কেন আর নতুনদের জন্য কঠিন হতে পারে তার একটি দুর্দান্ত উদাহরণ।
tumultous_rooster

4
বলা হচ্ছে, আমি মনে করি @ ashah57 এর নীচে অনেক সহজ এবং ক্লিনার উত্তর রয়েছে। এর মতো কোনও বিষয়ে খুব বেশি অভিনব হওয়ার দরকার নেই।
অস্থির_রোস্টার

12

অনুমান করা যায় যে cসবসময় অবিলম্বে অনুসরণ করা হয় b, আপনার কোড.ফ্রেমে bযেখানেই থাকুক না কেন এই কোডটি একটি কলাম যুক্ত করবে b

> test <- data.frame(a=1,b=1,c=1)
> test
  a b c
1 1 1 1

> bspot <- which(names(test)=="b")

> data.frame(test[1:bspot],d=2,test[(bspot+1):ncol(test)])
  a b d c
1 1 1 2 1

বা সম্ভবত আরও প্রাকৃতিকভাবে:

data.frame(append(test, list(d=2), after=match("b", names(test))))

5

ডেটা.ফ্রেম একটি উদাহরণ তৈরি করুন এবং এটিতে একটি কলাম যুক্ত করুন।

df = data.frame(a = seq(1, 3), b = seq(4,6), c = seq(7,9))
df['d'] <- seq(10,12)
df

  a b c  d
1 1 4 7 10
2 2 5 8 11
3 3 6 9 12

কলাম সূচক দ্বারা পুনরায় সাজানো

df[, colnames(df)[c(1:2,4,3)]]

বা কলামের নাম অনুসারে

df[, c('a', 'b', 'd', 'c')]

ফলাফল হলো

  a b  d c
1 1 4 10 7
2 2 5 11 8
3 3 6 12 9

3

আপনি x এবং y কলাম দ্বারা সংজ্ঞায়িত পুরানো ডেটা ফ্রেমে (old.df) কলামটি z যুক্ত করতে চান।

z = rbinom(1000, 5, 0.25)
old.df <- data.frame(x = c(1:1000), y = rnorm(1:1000))
head(old.df)

New.df নামে একটি নতুন ডেটা ফ্রেম সংজ্ঞায়িত করুন

new.df <- data.frame(x = old.df[,1], z, y = old.df[,2])
head(new.df)

3

ডেটা ফ্রেমে নির্দিষ্ট অবস্থানে একটি কলাম সন্নিবেশ করার দ্রুত এবং নোংরা উপায় এখানে way আমার ক্ষেত্রে, আমার কাছে মূল ডেটা ফ্রেমে 5 টি কলাম রয়েছে: c1, c2, c3, c4, c5এবং আমি এবং এর c2bমধ্যে একটি নতুন কলাম প্রবেশ করিয়ে দেবc2c3

1) আসুন প্রথমে পরীক্ষার ডেটা ফ্রেম তৈরি করি:

> dataset <- data.frame(c1 = 1:5, c2 = 2:6, c3=3:7, c4=4:8, c5=5:9)
> dataset
  c1 c2 c3 c4 c5
1  1  2  3  4  5
2  2  3  4  5  6
3  3  4  5  6  7
4  4  5  6  7  8
5  5  6  7  8  9

2) c2bআমাদের ডেটা ফ্রেমের শেষে নতুন কলাম যুক্ত করুন :

> dataset$c2b <- 10:14
> dataset
  c1 c2 c3 c4 c5 c2b
1  1  2  3  4  5  10
2  2  3  4  5  6  11
3  3  4  5  6  7  12
4  4  5  6  7  8  13
5  5  6  7  8  9  14

3) কলাম সূচকগুলির উপর ভিত্তি করে ডেটা ফ্রেমটি পুনঃক্রম করুন। আমার ক্ষেত্রে, আমি বিদ্যমান কলাম 2 এবং 3. আমি যে কি ভেক্টর ব্যবহার আমার ডেটা ফ্রেমে কলাম অ্যাড্রেসিং দ্বারা মধ্যে নতুন কলাম (6) সন্নিবেশ করতে চান c(1:2, 6, 3:5)যা সমতূল্য c(1, 2, 6, 3, 4, 5)

> dataset <- dataset[,c(1:2, 6, 3:5)]
> dataset
  c1 c2 c2b c3 c4 c5
1  1  2  10  3  4  5
2  2  3  11  4  5  6
3  3  4  12  5  6  7
4  4  5  13  6  7  8
5  5  6  14  7  8  9

ওখানে!


2

এটির মূল্যের জন্য, আমি এটি করার জন্য একটি ফাংশন লিখেছিলাম:

[সরানো]


আমি এখন এই ফাংশনটি beforeএবং afterকার্যকারিতা এবং ডিফল্টটিকে place1 এ আপডেট করেছি It এতে ডেটা টেবিলের সামঞ্জস্যতাও রয়েছে:

#####
# FUNCTION: InsertDFCol(colName, colData, data, place = 1, before, after)
# DESCRIPTION: Takes in a data, a vector of data, a name for that vector and a place to insert this vector into
# the data frame as a new column. If you put place = 3, the new column will be in the 3rd position and push the current
# 3rd column up one (and each subsuquent column up one). All arguments must be set. Adding a before and after
# argument that will allow the user to say where to add the new column, before or after a particular column.
# Please note that if before or after is input, it WILL override the place argument if place is given as well. Also, place
# defaults to adding the new column to the front.
#####

InsertDFCol <- function(colName, colData, data, place = 1, before, after) {

  # A check on the place argument.
  if (length(names(data)) < place) stop("The place argument exceeds the number of columns in the data for the InsertDFCol function. Please check your place number")
  if (place <= 0 & (!missing(before) | !(missing(after)))) stop("You cannot put a column into the 0th or less than 0th position. Check your place argument.")
  if (place %% 1 != 0 & (!missing(before) | !(missing(after)))) stop("Your place value was not an integer.")
  if (!(missing(before)) & !missing(after)) stop("You cannot designate a before AND an after argument in the same function call. Please use only one or the other.")

  # Data Table compatability.
  dClass <- class(data)
  data <- as.data.frame(data)

  # Creating booleans to define whether before or after is given.
  useBefore <- !missing(before)
  useAfter <- !missing(after)

  # If either of these are true, then we are using the before or after argument, run the following code.
  if (useBefore | useAfter) {

    # Checking the before/after argument if given. Also adding regular expressions.
    if (useBefore) { CheckChoice(before, names(data)) ; before <- paste0("^", before, "$") }
    if (useAfter) { CheckChoice(after, names(data)) ; after <- paste0("^", after, "$") }

    # If before or after is given, replace "place" with the appropriate number.
    if (useBefore) { newPlace <- grep(before, names(data)) ; if (length(newPlace) > 1) { stop("Your before argument matched with more than one column name. Do you have duplicate column names?!") }}
    if (useAfter) { newPlace <- grep(after, names(data)) ; if (length(newPlace) > 1) { stop("Your after argument matched with more than one column name. Do you have duplicate column names?!") }}
    if (useBefore) place <- newPlace # Overriding place.
    if (useAfter) place <- newPlace + 1 # Overriding place.

  }

  # Making the new column.
  data[, colName] <- colData

  # Finding out how to reorder this.
  # The if statement handles the case where place = 1.
  currentPlace <- length(names(data)) # Getting the place of our data (which should have been just added at the end).
  if (place == 1) {

    colOrder <- c(currentPlace, 1:(currentPlace - 1))

  } else if (place == currentPlace) { # If the place to add the new data was just at the end of the data. Which is stupid...but we'll add support anyway.

    colOrder <- 1:currentPlace

  } else { # Every other case.

    firstHalf <- 1:(place - 1) # Finding the first half on columns that come before the insertion.
    secondHalf <- place:(currentPlace - 1) # Getting the second half, which comes after the insertion.
    colOrder <- c(firstHalf, currentPlace, secondHalf) # Putting that order together.

  }

  # Reordering the data.
  data <- subset(data, select = colOrder)

  # Data Table compatability.
  if (dClass[1] == "data.table") data <- as.data.table(data)

  # Returning.
  return(data)

}

আমি বুঝতে পেরেছিলাম যে আমি চেক চয়েসও অন্তর্ভুক্ত করি নি:

#####
# FUNCTION: CheckChoice(names, dataNames, firstWord == "Oops" message = TRUE)                                                                                               
# DESCRIPTION: Takes the column names of a data frame and checks to make sure whatever "choice" you made (be it 
# your choice of dummies or your choice of chops) is actually in the data frame columns. Makes troubleshooting easier. 
# This function is also important in prechecking names to make sure the formula ends up being right. Use it after 
# adding in new data to check the "choose" options. Set firstWord to the first word you want said before an exclamation point.
# The warn argument (previously message) can be set to TRUE if you only want to 
#####

CheckChoice <- function(names, dataNames, firstWord = "Oops", warn = FALSE) {

  for (name in names) {

    if (warn == TRUE) { if(!(name %in% dataNames)) { warning(paste0(firstWord, "! The column/value/argument, ", name, ", was not valid OR not in your data! Check your input! This is a warning message of that!")) } }
    if (warn == FALSE) { if(!(name %in% dataNames)) { stop(paste0(firstWord, "! The column/value/argument, " , name, ", was not valid OR not in your data! Check your input!")) } }

  }
}

2

সহজ সমাধান। 5 টি কলাম সহ একটি ডেটা ফ্রেমে, আপনি যদি 3 থেকে 4 এর মধ্যে আর একটি কলাম সন্নিবেশ করতে চান ...

tmp <- data[, 1:3]
tmp$example <- NA # or any value.
data <- cbind(tmp, data[, 4:5]

1

এই ফাংশনটি একটি ডেটা ফ্রেমের সমস্ত পূর্ব-বিদ্যমান কলামগুলির মধ্যে একটি শূন্য কলাম সন্নিবেশ করায়।

insertaCols<-function(dad){   
  nueva<-as.data.frame(matrix(rep(0,nrow(daf)*ncol(daf)*2 ),ncol=ncol(daf)*2))  
   for(k in 1:ncol(daf)){   
      nueva[,(k*2)-1]=daf[,k]   
      colnames(nueva)[(k*2)-1]=colnames(daf)[k]  
      }  
   return(nueva)   
  }

1

শেষ থেকে প্রথম অবস্থানে কোনও কলাম কীভাবে স্থানান্তরিত করা যায় তার একটি উদাহরণ এখানে। এটা তোলে সম্মিলন [সঙ্গে ncol। আমি ভেবেছিলাম ব্যস্ত পাঠকের জন্য এখানে একটি খুব সংক্ষিপ্ত উত্তর দেওয়া দরকারী হবে:

d = mtcars
d[, c(ncol(d), 1:(ncol(d)-1))] 

1

আপনি append()ভেক্টর বা তালিকার মধ্যে আইটেমগুলি সন্নিবেশ করতে ফাংশনটি ব্যবহার করতে পারেন (ডেটাফ্রেমগুলি তালিকাভুক্ত হয়)। কেবল:

df <- data.frame(a=c(1,2), b=c(3,4), c=c(5,6))

df <- as.data.frame(append(df, list(d=df$b+df$c), after=2))

অথবা, যদি আপনি নাম ব্যবহার করে অবস্থানটি নির্দিষ্ট করতে চান which:

df <- as.data.frame(append(df, list(d=df$b+df$c), after=which(names(df)=="b")))

0

`

data1 <- data.frame(col1=1:4, col2=5:8, col3=9:12)
row.names(data1) <- c("row1","row2","row3","row4")
data1
data2 <- data.frame(col1=21:24, col2=25:28, col3=29:32)
row.names(data2) <- c("row1","row2","row3","row4")
data2
insertPosition = 2
leftBlock <- unlist(data1[,1:(insertPosition-1)])
insertBlock <- unlist(data2[,1:length(data2[1,])])
rightBlock <- unlist(data1[,insertPosition:length(data1[1,])])
newData <- matrix(c(leftBlock, insertBlock, rightBlock), nrow=length(data1[,1]), byrow=FALSE)
newData

`


0

নতুন কলামটি কোথায় যুক্ত হবে তা নির্দিষ্ট করার জন্য আর এর কোনও কার্যকারিতা নেই। যেমন mtcars$mycol<-'foo',। এটি সর্বদা শেষ কলাম হিসাবে যুক্ত করা হয়। অন্যান্য উপায় (যেমন, dplyr's select()) ব্যবহার করে আপনি মাইকোলটিকে একটি পছন্দসই অবস্থানে নিয়ে যেতে পারেন। এটি আদর্শ নয় এবং ভবিষ্যতে আর পরিবর্তন করার চেষ্টা করতে পারে R


হ্যাঁ, এটির appendকার্যকারিতা রয়েছে।
সাইমন উডওয়ার্ড


0
df <- data.frame(a=c(1,2), b=c(3,4), c=c(5,6))
df %>%
  mutate(d= a/2) %>%
  select(a, b, d, c)

ফলাফল

  a b   d c
1 1 3 0.5 5
2 2 4 1.0 6

আমি dplyr::selectপরে ব্যবহার করার পরামর্শ দিচ্ছি dplyr::mutate। কলামগুলির সাবসেট নির্বাচন / ডি-সিলেক্ট করতে এটির অনেক সহায়ক রয়েছে।

এই প্রশ্নের প্রসঙ্গে আপনি যে ক্রম দ্বারা নির্বাচন করেছেন সেটি আউটপুট ডেটা.ফ্রেমে প্রতিফলিত হবে।


0

আপনি যখন অনুমান করতে পারবেন না যে কলামটি bআসার আগে cআপনি matchউভয়ের কলাম নম্বর খুঁজতে, minনিম্ন কলাম নম্বর seq_lenপেতে এবং এই কলামটি পর্যন্ত একটি ক্রম পেতে ব্যবহার করতে পারেন। তারপরে আপনি নতুন কলামটি রাখার চেয়ে ইতিবাচক সাবসেট হিসাবে প্রথমে এই সূচকটি ব্যবহার করতে পারেন dএবং তারপরে আবার ক্রমটিকে নেতিবাচক সাবসেট হিসাবে ব্যবহার করতে পারেন ।

i <- seq_len(min(match(c("b", "c"), colnames(x))))
data.frame(x[i], d, x[-i])
#cbind(x[i], d, x[-i]) #Alternative
#  a b  d c
#1 1 4 10 7
#2 2 5 11 8
#3 3 6 12 9

আপনি যদি জানেন যে কলামটি পরে নতুন কলামটি স্থাপন করার bআগে আসবে :cdb

i <- seq_len(match("b", colnames(x)))
data.frame(x[i], d, x[-i])
#  a b  d c
#1 1 4 10 7
#2 2 5 11 8
#3 3 6 12 9

ডেটা:

x <- data.frame(a = 1:3, b = 4:6, c = 7:9)
d <- 10:12
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.