2

目的は、データ フレームの列を変換することです。次に例を示します。

  df <- data.frame( fact=c("dog",2,"NA",0,"cat",1,"Cat"),
              value=c(4,2,6,0,9,1,3) ); df$fact <- as.factor(df$fac)

  func <- function(data,fac,val){
          data <- data %>%  
          mutate_(fac= interp(~tolower(fac), fac=as.name(fac)) ) %>%
          mutate_(val= interp(~ifelse(fac=='cat',1*val,
                       ifelse(fac=='dog',2*val,0)), fac=as.name(fac), val=as.name(val)))
  return(data) } 

呼び出し:

new.df <- func(df,"fact","value")

     fact value  fac val
   1  dog     4  dog  8
   2    2     2   2   0
   3   NA     6  na   0
   4    0     0   0   0
   5  cat     9 cat   9
   6    1     1   1   0
   7  Cat     3 cat   0

2 つの問題があります: (1)- "Cat" に関連付けられた値が false です。3*1=3 (2) である必要があります。呼び出しは、理想的にはdf、変換された変数factvalue変数を含む元の data.frame を返します。

何かご意見は?君たちありがとう。

編集: には、 およびに対して行われた操作の影響を受けないようにする必要があるdf別の列があることに注意してください。thirdfactvalue

4

2 に答える 2

4

OP のコードでは、変更されていない「ファクト」列に基づいて「val」が作成されました。最初の 'fac' を変更して使用している場合mutate_、 は必要ありませんas.name(fac)

library(lazyeval)
library(dplyr)
func <- function(data,fac,val){
      data <- data %>%  
               mutate_(fac= interp(~tolower(fac), fac=as.name(fac))) %>%
               mutate_(val= interp(~ifelse(fac=='cat',1*val,
                   ifelse(fac=='dog',2*val,0)), val=as.name(val)))
  return(data) } 

func(df, 'fact', 'value')
#  fact value fac val
#1  dog     4 dog   8
#2    2     2   2   0
#3   NA     6  na   0
#4    0     0   0   0
#5  cat     9 cat   9
#6    1     1   1   0
#7  Cat     3 cat   3

変更された列のみを返す必要がある場合は、使用しますtransmute_

func1 <- function(data,fac,val){
      data <- data %>%  
               transmute_(fac= interp(~tolower(fac), fac=as.name(fac)), 
                      val= interp(~ifelse(fac=='cat',1*val,
                         ifelse(fac=='dog',2*val,0)), val=as.name(val)))
     return(data) } 

func1(df, 'fact', 'value')
#  fac val
#1 dog   8
#2   2   0
#3  na   0
#4   0   0
#5 cat   9
#6   1   0
#7 cat   3
于 2015-09-24T13:48:41.127 に答える
2

元の列 (data.frame の他の列を含む可能性がある) を元の名前で返したい場合は、次mutate_eachの代わりに少し異なる dplyr-approach を使用できmutateます。

library(lazyeval)
library(dplyr)

func <- function(data,fac,val) {
  data %>%  
    mutate_each_(interp(~tolower(var), var = as.name(fac)), fac) %>% 
    mutate_each_(interp(~ifelse(col =='cat', var, ifelse(col == 'dog',2*var, 0)), 
             var=as.name(val), col = as.name(fac)), val)
}

関数の使用:

func(df, "fact", "value")
#  fact value
#1  dog     8
#2    2     0
#3   na     0
#4    0     0
#5  cat     9
#6    1     0
#7  cat     3

データに保持したい他の列がある場合、akruns の回答との違いが示されます (一方、それらは akrun のアプローチでは削除されますtransmute)。

df$some_column <- letters[1:7]  # add a new column

関数を使用した後も他の列はデータに残り、変更された列は元の名前を保持します。

func(df, "fact", "value")
#  fact value some_column
#1  dog     8           a
#2    2     0           b
#3   na     0           c
#4    0     0           d
#5  cat     9           e
#6    1     0           f
#7  cat     3           g
于 2015-09-24T14:28:58.130 に答える