我需要幫助定義一個函數,該函數在數據庫中創建一個向量,其中對於每一行,函數查看該數據庫中的另一列,在指定的數據庫中搜索該值創建第二個數據庫的一個子集,該數據庫由所有匹配的行組成,並對該子集中的一個單獨列進行求和,然後將該值返回到原始數據庫中新列的相應行。用戶定義函數來創建和求和R中的一個子集
換句話說,我有一個看起來是這樣的一個數據幀:
ID <- c('a', 'b', 'c', 'd', 'e')
M <- 20:39
df <- data.frame(cbind(ID, M))
df$M <- as.numeric(df$M)
> df
ID M
1 a 1
2 b 2
3 c 3
4 d 4
5 e 5
6 a 6
7 b 7
8 c 8
9 d 9
10 e 10
11 a 11
12 b 12
13 c 13
14 d 14
15 e 15
16 a 16
17 b 17
18 c 18
19 d 19
20 e 20
> str(df)
'data.frame': 20 obs. of 2 variables:
$ ID: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5 1 2 3 4 5 ...
$ M : num 1 2 3 4 5 6 7 8 9 10 ...
我想創建一個新的數據幀,Z
,這樣Z <- data.frame(cbind(X, Y))
其中:
X <- as.character(unique(df$ID))
> X
[1] "a" "b" "c" "d" "e"
Y
是所有a的總和,所有b的總和,所有c的總和等的向量...
因此,Y
sh烏爾德等於c(34, 38, 42, 46, 50)
和我最後的結果應該是:
> Z
X Y
1 a 34
2 b 38
3 c 42
4 d 46
5 e 50
> str(Z)
'data.frame': 5 obs. of 2 variables:
$ X: chr "a" "b" "c" "d" ...
$ Y: num 34 38 42 46 50
要做到這一點,我已經試過第一次打開X
到數據幀(是不是容易的工作作爲一個數據表):
> Z <- data.frame(X)
> Z
X
1 a
2 b
3 c
4 d
5 e
> str(Z)
'data.frame': 5 obs. of 1 variable:
$ X: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5
然後定義Y
作爲Z$Y <- sum(df[df$ID == Z$X, 2])
,但我不明白的唯一值:
> Z
X Y
1 a 210
2 b 210
3 c 210
4 d 210
5 e 210
我也試着定義函數f1()
像這樣:
f1 <- function(v, w, x, y, z){sum(v[v$w == x$y, z])}
但讓我:
> f1(df, 'ID', Z, 'X', 'M')
[1] 0
我發現從這個論壇另一篇文章的功能,做類似的事情:
f1 <- function(df, cols, match_with, to_x = 50){
df[cols] <- lapply(df[cols], function(i)
ifelse(grepl(to_x, match_with, fixed = TRUE), 'MID',
i))
return(df)
}
這看起來對在match_with
列中的值「50」,並且將值「MID」返回到由cols
指定的列的那一行,提供兩列在相同的指定數據中e df
。因此,我需要用to_x = 50
替代to_x = 50
,而不是查找固定值「50」,查找列Z$X
中的任何值,而不是返回固定值「MID」,返回值的總和df[df$ID == Z$X, df$M]
。我已經寫了以下的變化嘗試這些改變自己:
f1 <- function(df, cols, match_with, to_x = df[ , 1], x){
df[cols] <- lapply(df[cols], function(i)
ifelse(grepl(to_x, match_with, fixed = TRUE), sum(x),
i))
return(df)
}
但是,到目前爲止,還沒有我的變化已經產生了預期的效果。這個人給我:
> f1(Z, df, cols = c('Y'), match_with = df$ID, x = df$M)
X Y
1 a 210
2 b 210
3 c 210
4 d 210
5 e 210
Warning messages:
1: In grepl(to_x, match_with, fixed = TRUE) :
argument 'pattern' has length > 1 and only the first element will be used
2: In `[<-.data.frame`(`*tmp*`, cols, value = list(Y = c(210, 210, :
replacement element 1 has 20 rows to replace 5 rows
這似乎是總結的df$M
而不是子集,其中df$ID == Z$X
全部。在其他變體中,它在第二個數據框中引用列時似乎有問題。
我對R有點新,並且幾乎沒有編寫用戶定義函數的經驗(正如你可能通過這個問題所說的那樣)。任何幫助將非常感謝!