亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在數據框的每一行上調用類似應用的函數,每一行具有多個參數

在數據框的每一行上調用類似應用的函數,每一行具有多個參數

瀟瀟雨雨 2019-10-24 13:50:56
我有一個多列的數據框。對于數據框中的每一行,我想在該行上調用一個函數,并且該函數的輸入正在使用該行中的多個列。例如,假設我有此數據和接受兩個參數的testFunc:> df <- data.frame(x=c(1,2), y=c(3,4), z=c(5,6))> df  x y z1 1 3 52 2 4 6> testFunc <- function(a, b) a + b假設我想將此testFunc應用于列x和z。因此,對于第1行,我想要1 + 5,對于第2行,我想要2 + 6。是否有一種無需編寫for循環就能做到這一點的方法,也許可以使用apply函數族?我嘗試了這個:> df[,c('x','z')]  x z1 1 52 2 6> lapply(df[,c('x','z')], testFunc)Error in a + b : 'b' is missing但是有錯誤,有什么想法嗎?編輯:我要調用的實際函數不是一個簡單的總和,而是power.t.test。我僅出于示例目的使用a + b。最終目標是能夠執行以下操作(用偽代碼編寫):df = data.frame(    delta=c(delta_values),     power=c(power_values),     sig.level=c(sig.level_values))lapply(df, power.t.test(delta_from_each_row_of_df,                         power_from_each_row_of_df,                         sig.level_from_each_row_of_df))其中結果是df每行的power.t.test輸出的向量。
查看完整描述

3 回答

?
慕工程0101907

TA貢獻1887條經驗 獲得超5個贊

您可以將其應用于apply原始數據的子集。


 dat <- data.frame(x=c(1,2), y=c(3,4), z=c(5,6))

 apply(dat[,c('x','z')], 1, function(x) sum(x) )

或者如果您的函數只是求和,請使用向量化版本:


rowSums(dat[,c('x','z')])

[1] 6 8

如果要使用 testFunc


 testFunc <- function(a, b) a + b

 apply(dat[,c('x','z')], 1, function(x) testFunc(x[1],x[2]))

編輯要通過名稱訪問列而不是索引,您可以執行以下操作:


 testFunc <- function(a, b) a + b

 apply(dat[,c('x','z')], 1, function(y) testFunc(y['z'],y['x']))


查看完整回答
反對 回復 2019-10-24
?
qq_遁去的一_1

TA貢獻1725條經驗 獲得超8個贊

dplyr套餐的新答案

如果要應用的功能是矢量化的,則可以使用軟件包中的mutate功能dplyr:


> library(dplyr)

> myf <- function(tens, ones) { 10 * tens + ones }

> x <- data.frame(hundreds = 7:9, tens = 1:3, ones = 4:6)

> mutate(x, value = myf(tens, ones))

  hundreds tens ones value

1        7    1    4    14

2        8    2    5    25

3        9    3    6    36

plyr包裝的舊答案

我認為,最適合該任務的工具mdply來自plyr包裝。


例:


> library(plyr)

> x <- data.frame(tens = 1:3, ones = 4:6)

> mdply(x, function(tens, ones) { 10 * tens + ones })

  tens ones V1

1    1    4 14

2    2    5 25

3    3    6 36

不幸的是,正如Bertjan Broeksema指出的那樣,如果您沒有在mdply調用中使用數據幀的所有列,則此方法將失敗。例如,


> library(plyr)

> x <- data.frame(hundreds = 7:9, tens = 1:3, ones = 4:6)

> mdply(x, function(tens, ones) { 10 * tens + ones })

Error in (function (tens, ones)  : unused argument (hundreds = 7)


查看完整回答
反對 回復 2019-10-24
  • 3 回答
  • 0 關注
  • 839 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號