-1

パンダでは、次のようなカスタム関数を使用して行単位の操作を頻繁に実行します。

df = pd.DataFrame({'v1': [1, 2, 3], 'v2': [3, 4, 6], 'v3': [3, 4, 5]})

def f(row):
    return(sum(row[["v1", "v3"]]) if row.v2 == 3 else 7)

df["new_col"] = df.apply(f, 1)

dplyrに相当するものは何ですか?

関数 f は、v1 から v3 だけでなく、多くの変数を使用できる可能性があることに注意してください。

編集:現在Rにあるもののコード例。このソリューションでは、適切かどうか疑問に思っている代名詞オブジェクトを渡しています。

d <- tibble(v1 = c(1,2,3), v2 = c(3,4,6), v3 = c(3,4,5))

f <- function(row){
  if (row$v2 == 3) sum(something?) else 7
}

d %>% rowwise() %>% mutate(new_column = f(.data)) %>% ungroup()

edit2: 予想される出力。(インデックス列は重要ではありません)

   v1  v2  v3  new_col
0   1   3   3        4
1   2   4   4        7
2   3   6   5        7

注: この特定の問題の解決策を探しているわけではありません。パンダの apply() のように、R/dplyr の関数に行を渡す一般的な方法に興味があります。

4

3 に答える 3

1

行全体をデータフレームとして関数に渡す同等の dplyr コードは次のようになります。

library(tidyverse)

df <- tibble(v1 = c(1, 2, 3), v2 = c(4, 5, 6), v3 = c(7, 8, 9))

f <- function(row){
  if (row$v2 == 3){
    return(sum(row$v1, row$v3))
  }else{
    return(7)
  }
}

df %>% 
  rowwise() %>% 
  do(row = as_data_frame(.)) %>%
  mutate(new_col = f(row)) %>% 
  unnest()

外:

# A tibble: 3 x 4
  new_col    v1    v2    v3
    <dbl> <dbl> <dbl> <dbl>
1       4     1     3     3
2       7     2     4     4
3       7     3     6     5
于 2018-12-21T16:26:20.413 に答える
0
df %>% mutate(new_col=with(.,case_when(v2 != 3 ~ 7,v2 == 3 ~ (v1 + v3))))

出力

 v1 v2 v3 new_col
1  1  3  3       4
2  2  4  4       7
3  3  6  5       7
于 2018-12-21T17:11:14.370 に答える