R 中函数识别唯一值和输入的函数

问题描述 投票:0回答:1

这就是我的函数的一部分:

function_test <- function(x) {
fa_dataset <- test_survey %>% 
  filter(Tenure_Category == x) %>% 
  dplyr::select(c(Proud:Respect)) %>% 
  drop_na()

cor_mat_tenure <- cor(fa_dataset)

}

function_test("0-1 Yr")
function_test("1-2 Yr")
function_test("2-5 Yr")

我有一个包含 n 列的数据集,数据集“test_survey”中的一列是“Tenure_Category”。此列有 7 个不同的值:0-1 年、1-2 年、2-5 年、5-10 年、10-15 年、15-20 年、20+ 年。

我想添加到代码中。我希望函数能够识别这些不同的值,然后将它们一一输入到过滤器语句中。我不想在函数中手动指定参数(就像我上面所做的那样)。

我认为 for 循环会是更好的选择,比如:

for(i in 1:length(unique(test_survey$Tenure_Category))){
   fa_dataset <- test_survey %>% 
   filter(Tenure_Category == test_survey[i]) %>%
   dplyr::select(c(Proud:Respect)) %>% 
   drop_na()

   cor_mat_tenure <- cor(fa_dataset)
 }

不用说,这段代码不起作用。

如有任何帮助,我们将不胜感激。

谢谢你。

r function distinct
1个回答
0
投票

您的问题缺乏可重现的示例,并且缺乏清晰度。但如果我理解正确的话,您想通过

Tenure category
过滤数据框,然后计算
Proud
Respect
之间的相关性。是这样吗?另外,我假设您希望保留每个相关性的结果,同时保留指向
Tenure category
的链接。

下面是 for 循环解决方案的示例。

library(dplyr)
library(tidyverse)

tenure_category <- c('0-1 Yr', '1-2 Yr', '2-5 Yr', '5-10 Yr', '10-15 Yr', '15-20 Yr', '20+ Yr')

tenure_category <- sample(tenure_category, 100, replace = TRUE) # creates a vector with 100 observations of strings in tenure category

proud <- runif(100, min=0, max=100)

respect <- runif(100, min=0, max=100)

df <- data.frame(Tenure_Category = tenure_category, Proud = proud, Respect = respect)

names <- unique((tenure_category))

cor_l <- list() # list object to keep the resulting correlations
for (i in 1:length(names)){
  tmp <- df %>%
    filter(Tenure_Category == names[i]) %>% 
    select(Proud, Respect) # unclear from your question if you actually need to keep this data frame or you just need the resulting correlation
  
  cor_l[[i]] <- cor(tmp)
  
  # Adding name to each list oject, so that you keep track of Tenure_Category
  names(cor_l)[i] <- names[i]
}

print(cor_l[1:2])

# $`15-20 Yr`
# Proud   Respect
# Proud   1.0000000 0.1439552
# Respect 0.1439552 1.0000000
# 
# $`10-15 Yr`
# Proud      Respect
# Proud    1.000000000 -0.004051884
# Respect -0.004051884  1.000000000
© www.soinside.com 2019 - 2024. All rights reserved.