[英]Creating a function looping over each row in R
我想編寫一個 function ,它為第 1-3 列創建一個帶有 rowmeans 的新列,前提是每行第 1-3 列的問題超過 2 個,否則打印“N”。
這是我的 dataframe:
test <- data.frame(Manager1 = c(1, 3, 3), Manager2 = c(3, 4, 1), Manager3 = c(NA, 4, 2), Team1 = c(3, 4, 1))
所需的 output:
Manager1 Manager2 Manager3 Team1 mean_score
1 3 3 N
3 4 4 4 3.66667
3 1 2 1 2
我的代碼如下,但它不起作用:
#create function
mean_score <- function(x) {
for (i in 1:nrow(test)){
if (sum(test[i, x] != "NA", na.rm = TRUE) >2){
test$mean_score[i] <- rowMeans(test[i, x], na.rm = TRUE)
} else
test$mean_score[i] <- print("N")
}
}
#compute function
mean_score(1:3)
我錯過了什么? 也歡迎對更好的代碼提出建議。
您可以簡單地使用rowMeans
什么將返回NA
如果有一行持有NA
此處應該相當於僅當回答了每行 1-3 列的 2 個以上問題時。
test$mean_score <- rowMeans(test[,1:3])
# Manager1 Manager2 Manager3 Team1 mean_score
#1 1 3 NA 3 NA
#2 3 4 4 4 3.666667
#3 3 1 2 1 2.000000
雖然 GKi 有一個更簡單的更好答案,並且您應該在這里使用的是我將您的代碼更改為使其正常工作的內容。
通常在制作 function 時,您希望輸入為 dataframe,在這種情況下為text
並從那里更改 function。
另一個需要注意的重要事項是,您可能希望先創建一個值向量,然后將所述向量附加到 dataframe 上,就像我在下面的代碼中所做的那樣,但您需要確保創建一個空向量 object 來執行此操作。 R 並沒有真正讓你慢慢地將單元格數據添加到 dataframe 中,它更喜歡將相等長度的向量(可以添加到)加入到它。
此外,您也不需要使用print()
將字符插入向量中。
希望這有助於解釋為什么您的 function 有問題,但坦率地說,GKi 的答案更適合一般 R 使用!
mean_score <- function(x) {
mean_score <- vector()
for (i in 1:nrow(x)){
if (sum(x[i,] != "NA", na.rm = TRUE) >3){
mean_score[i] <- rowMeans(x[i,], na.rm = TRUE)
} else
mean_score[i] <- "N"
}
x$mean_score <- mean_score
return(x)
}
mean_score(test)
我認為將字符與數值放在一起並不理想,因為它將整個列轉換為字符。 但是,如果這是您想要的:
my_sum <- function(x,min=2){
s <- mean(x, na.rm = T) # get the mean
no_na <- sum(!is.na(x)) # count the number of non NAs
if(no_na>min){s}else{"N"} # return mean if enough non NAs
}
test$mean <- apply(test[,1:3],1,my_sum)
test
Manager1 Manager2 Manager3 Team1 mean
1 1 3 NA 3 N
2 3 4 4 4 3.66666666666667
3 3 1 2 1 2
str(test)
'data.frame': 3 obs. of 5 variables:
$ Manager1: num 1 3 3
$ Manager2: num 3 4 1
$ Manager3: num NA 4 2
$ Team1 : num 3 4 1
$ mean : chr "N" "3.66666666666667" "2"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.