简体   繁体   中英

Assign value to dynamic column name in a function in R

I have a table:

num1<-runif(10)
num2<-runif(10)
df<-data.frame(num1,num2)
df
         num1      num2
1  0.41170486 0.8198323
2  0.46594131 0.7300186
3  0.09005351 0.9667960
4  0.33373968 0.6827277
5  0.48305910 0.2254627
6  0.23514394 0.3348283
7  0.79450479 0.3101271
8  0.30476853 0.6706657
9  0.53643541 0.9761387
10 0.66568823 0.8444414

And I want to create a percentile column for each of these 2 columns respectively so the table looks like this:

 df
         num1      num2.   num1_percentile   num2_percentile
1  0.41170486 0.8198323    20%                40%
2  0.46594131 0.7300186    xxx               xxx
3  0.09005351 0.9667960    xxx               xxx
4  0.33373968 0.6827277    xxx               xxx
5  0.48305910 0.2254627    xxx               xxx
6  0.23514394 0.3348283    xxx               xxx
7  0.79450479 0.3101271    xxx               xxx
8  0.30476853 0.6706657    xxx               xxx
9  0.53643541 0.9761387    xxx               xxx
10 0.66568823 0.8444414    xxx               xxx

So the percentile column name will be based on the if it's num1 or num2 . I have this function where I am trying to assign percentile values to dynamic column names but seems like assign() did not store values in num1_percentile .

create_percentile<-function(num){
  
  breaks=c( quantile(df[[num]], probs =seq(0, 1, 0.2)))
  
  
  
  values<- cut(df[[num]],
               breaks=breaks,labels=c(  '20%','40%', '60%','80%','100%'))
  values[is.na(values)]<-'20%'
  
  print(values)
  
  assign(paste0(df,'_percentile'),values)
  
  df<-cbind(df,paste0(num,'_percentile'))
  
  return(df)
}

create_percentile('num1')

How do I make it work so it can assign values to dynamic column names?

The reason behind assign not storing the value is that you are storing it in assign(paste0(df,'_percentile'),values) where df is a data frame. So while assigning it considers the first element of df to paste it with _percentile . A small correction is instead of df you can use num .

Also this function cbind(df,paste0(num,'_percentile')) won't work as expected because it will store a character value returned from paste command.

You may use the below code to assign the values to dynamic column names

num1 <- runif(10)
num2 <- runif(10)
df <- data.frame(num1, num2)
df

         num1       num2
1  0.78584180 0.61999953
2  0.33916132 0.91999116
3  0.84080205 0.19279828
4  0.03563479 0.04253741
5  0.16633144 0.23509481
6  0.15459396 0.84458053
7  0.99544676 0.08727064
8  0.25060605 0.51908750
9  0.35631173 0.48853416
10 0.50649402 0.64245468

create_percentile <- function(num) {
  breaks <- quantile(df[[num]], probs = seq(0, 1, 0.2))
  values <- cut(df[[num]], breaks = breaks, labels = c('20%', '40%', '60%', '80%', '100%'))
  values[is.na(values)] <- '20%'
  df <- cbind(df, values)
  names(df)[ncol(df)] <- paste0(num, '_percentile')
  return(df)
}

df <- create_percentile('num1')
df <- create_percentile('num2')

Output:

         num1       num2 num1_percentile num2_percentile
1  0.78584180 0.61999953             80%             80%
2  0.33916132 0.91999116             60%            100%
3  0.84080205 0.19279828            100%             40%
4  0.03563479 0.04253741             20%             20%
5  0.16633144 0.23509481             40%             40%
6  0.15459396 0.84458053             20%            100%
7  0.99544676 0.08727064            100%             20%
8  0.25060605 0.51908750             40%             60%
9  0.35631173 0.48853416             60%             60%
10 0.50649402 0.64245468             80%             80%

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM