আমার কাছে একটি ডেটা ফ্রেম রয়েছে যাতে ক, ক এবং ক কলাম রয়েছে। আমি খ এবং গ এর মধ্যে একটি নতুন কলাম যুক্ত করতে চাই।
আমি শুধু ব্যবহার করে শেষে ঘ যোগ করতে পারিনি জানি cbind কিন্তু কিভাবে আমি করতে পারেন সন্নিবেশ দুটি কলাম মধ্যে এটা?
আমার কাছে একটি ডেটা ফ্রেম রয়েছে যাতে ক, ক এবং ক কলাম রয়েছে। আমি খ এবং গ এর মধ্যে একটি নতুন কলাম যুক্ত করতে চাই।
আমি শুধু ব্যবহার করে শেষে ঘ যোগ করতে পারিনি জানি cbind কিন্তু কিভাবে আমি করতে পারেন সন্নিবেশ দুটি কলাম মধ্যে এটা?
উত্তর:
আমি আপনাকে প্যাকেজ 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")
আপনার নতুন কলামে যুক্ত করুন:
df$d <- list/data
তারপরে আপনি সেগুলি পুনরায় অর্ডার করতে পারেন।
df <- df[, c("a", "b", "d", "c")]
setcolorder
কলাম নম্বরগুলির সাথে মিলিতভাবে (তাদের নামগুলির বিপরীতে) ব্যবহার করেও খুব দরকারী হতে পেলাম , কারণ কলামগুলির সংখ্যা খুব বড় হয়ে যাওয়ার পরে আপনি বেশিরভাগ কাজ শুরু করতে seq
এবং শুরু করতে পারেন rep
। প্লাস গণিত অপারেটর ব্যবহার করা যেতে পারে। উদাহরণস্বরূপsetcolorder(data, c(1, (num_cols -2), (num_cols -1), num_cols, seq(from = 2, to = (num_cols - 3))))
setcolorder
ডেটা টেবিলের জন্য বোঝানো হয়, ডেটাফ্রেম নয়!
আপনি [, বা কলামগুলি আপনার পছন্দ অনুযায়ী ক্রম উপস্থাপন করতে কলামগুলি পুনরায় অর্ডার করতে পারেন।
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
অনুমান করা যায় যে 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))))
ডেটা.ফ্রেম একটি উদাহরণ তৈরি করুন এবং এটিতে একটি কলাম যুক্ত করুন।
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
আপনি 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)
ডেটা ফ্রেমে নির্দিষ্ট অবস্থানে একটি কলাম সন্নিবেশ করার দ্রুত এবং নোংরা উপায় এখানে way আমার ক্ষেত্রে, আমার কাছে মূল ডেটা ফ্রেমে 5 টি কলাম রয়েছে: c1, c2, c3, c4, c5
এবং আমি এবং এর c2b
মধ্যে একটি নতুন কলাম প্রবেশ করিয়ে দেবc2
c3
।
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
ওখানে!
এটির মূল্যের জন্য, আমি এটি করার জন্য একটি ফাংশন লিখেছিলাম:
[সরানো]
আমি এখন এই ফাংশনটি before
এবং after
কার্যকারিতা এবং ডিফল্টটিকে place
1 এ আপডেট করেছি 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!")) } }
}
}
সহজ সমাধান। 5 টি কলাম সহ একটি ডেটা ফ্রেমে, আপনি যদি 3 থেকে 4 এর মধ্যে আর একটি কলাম সন্নিবেশ করতে চান ...
tmp <- data[, 1:3]
tmp$example <- NA # or any value.
data <- cbind(tmp, data[, 4:5]
এই ফাংশনটি একটি ডেটা ফ্রেমের সমস্ত পূর্ব-বিদ্যমান কলামগুলির মধ্যে একটি শূন্য কলাম সন্নিবেশ করায়।
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)
}
শেষ থেকে প্রথম অবস্থানে কোনও কলাম কীভাবে স্থানান্তরিত করা যায় তার একটি উদাহরণ এখানে। এটা তোলে সম্মিলন [
সঙ্গে ncol
। আমি ভেবেছিলাম ব্যস্ত পাঠকের জন্য এখানে একটি খুব সংক্ষিপ্ত উত্তর দেওয়া দরকারী হবে:
d = mtcars
d[, c(ncol(d), 1:(ncol(d)-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")))
`
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
`
নতুন কলামটি কোথায় যুক্ত হবে তা নির্দিষ্ট করার জন্য আর এর কোনও কার্যকারিতা নেই। যেমন mtcars$mycol<-'foo'
,। এটি সর্বদা শেষ কলাম হিসাবে যুক্ত করা হয়। অন্যান্য উপায় (যেমন, dplyr's select()
) ব্যবহার করে আপনি মাইকোলটিকে একটি পছন্দসই অবস্থানে নিয়ে যেতে পারেন। এটি আদর্শ নয় এবং ভবিষ্যতে আর পরিবর্তন করার চেষ্টা করতে পারে R
append
কার্যকারিতা রয়েছে।
আপনি নীচের মত এটি করতে পারেন -
df <- data.frame(a=1:4, b=5:8, c=9:12)
df['d'] <- seq(10,13)
df <- df[,c('a','b','d','c')]
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
। কলামগুলির সাবসেট নির্বাচন / ডি-সিলেক্ট করতে এটির অনেক সহায়ক রয়েছে।
এই প্রশ্নের প্রসঙ্গে আপনি যে ক্রম দ্বারা নির্বাচন করেছেন সেটি আউটপুট ডেটা.ফ্রেমে প্রতিফলিত হবে।
আপনি যখন অনুমান করতে পারবেন না যে কলামটি 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
আগে আসবে :c
d
b
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