基于因子变量的数据集子集生成与因子长度一样多的子集
Dataset sub-setting based on a factor variable that generates as many subsets as the factor length
我正在处理一个数据集(名为 "scores"),该数据集仅包含数值变量,但也包含一个表明数值来自哪个国家/地区的因素。所有这些都是一个数据集中的列。
我对如何使我用于子集化的代码部分更加独立感到困惑。例如,在数据集 "scores" 中,我使用以下内容为每个国家/地区生成一个子集:
scores_us <- scores[which(scores$Country== 1)]
scores_uk <- scores[which(scores$Country== 2)]
scores_it <- scores[which(scores$Country== 3)]
我需要做的是使这部分更加独立,这样当不熟悉 R 的人针对不同的国家/地区运行它时,不必总是为因子的每个级别写一行.
也许是一个遍历该因子并只创建与其级别一样多的子集的循环?
非常感谢您的任何想法。
P.s 我尝试使用 for i in length(scores$Country)
但它 returns 一个包含所有国家的子集而不是三个。
更新问题:
你说得对,我一直很不清楚。我的数据集得分为 1-10(意见/看法),代表一组国家的有序数据。我的下一步是计算每个国家/地区所有列的 "NPS- Net Promoter Score"。到目前为止,我对每个国家/地区进行了子集化处理,然后对每个国家/地区应用了 nps 函数(nps 包),这会生成一个新列表,其中包含每个问题的 NPS 编号(分数列)。这样做的代码示例是:
scores_us <- scores[which(scores$Country== 1)]
scores_uk <- scores[which(scores$Country== 2)]
scores_it <- scores[which(scores$Country== 3)]
nps_us<-round(sapply(scores_us, nps)*100)
nps_uk<-round(sapply(scores_uk, nps)*100)
nps_it<-round(sapply(scores_it, nps)*100)
您提出的 split
方法实现了子集化,而无需用户为每个国家/地区编写一行代码。它生成一个数据帧列表。但是,当使用 sapply/lapply 计算 nps 时,它 returns 警告:class data.frame 提供的数据;转换为数字,元素为 NA。
可能是因为输出列表的维度与列出的数据帧 (lst1) 不同?或者因为 nps 不适用于 apply 系列?
你的替代方案 group_by 然后执行 nps 函数 returns nps 结果
但没有做每个国家的。这就是我用于此的内容:scores_df %>% group_by(Country) %>% lapply(., nps)
.
如果 nps
可以处理 split
生成的数据帧列表,那正是我正在寻找的。
再次感谢。
我们可以使用split
拆分为data.frame
个list
(假设'scores_df'和'scores'具有相同的维度)
lst1 <- split(scores_df, scores$Country)
我正在处理一个数据集(名为 "scores"),该数据集仅包含数值变量,但也包含一个表明数值来自哪个国家/地区的因素。所有这些都是一个数据集中的列。
我对如何使我用于子集化的代码部分更加独立感到困惑。例如,在数据集 "scores" 中,我使用以下内容为每个国家/地区生成一个子集:
scores_us <- scores[which(scores$Country== 1)]
scores_uk <- scores[which(scores$Country== 2)]
scores_it <- scores[which(scores$Country== 3)]
我需要做的是使这部分更加独立,这样当不熟悉 R 的人针对不同的国家/地区运行它时,不必总是为因子的每个级别写一行.
也许是一个遍历该因子并只创建与其级别一样多的子集的循环?
非常感谢您的任何想法。
P.s 我尝试使用 for i in length(scores$Country)
但它 returns 一个包含所有国家的子集而不是三个。
更新问题:
你说得对,我一直很不清楚。我的数据集得分为 1-10(意见/看法),代表一组国家的有序数据。我的下一步是计算每个国家/地区所有列的 "NPS- Net Promoter Score"。到目前为止,我对每个国家/地区进行了子集化处理,然后对每个国家/地区应用了 nps 函数(nps 包),这会生成一个新列表,其中包含每个问题的 NPS 编号(分数列)。这样做的代码示例是:
scores_us <- scores[which(scores$Country== 1)]
scores_uk <- scores[which(scores$Country== 2)]
scores_it <- scores[which(scores$Country== 3)]
nps_us<-round(sapply(scores_us, nps)*100)
nps_uk<-round(sapply(scores_uk, nps)*100)
nps_it<-round(sapply(scores_it, nps)*100)
您提出的 split
方法实现了子集化,而无需用户为每个国家/地区编写一行代码。它生成一个数据帧列表。但是,当使用 sapply/lapply 计算 nps 时,它 returns 警告:class data.frame 提供的数据;转换为数字,元素为 NA。
可能是因为输出列表的维度与列出的数据帧 (lst1) 不同?或者因为 nps 不适用于 apply 系列?
你的替代方案 group_by 然后执行 nps 函数 returns nps 结果
但没有做每个国家的。这就是我用于此的内容:scores_df %>% group_by(Country) %>% lapply(., nps)
.
如果 nps
可以处理 split
生成的数据帧列表,那正是我正在寻找的。
再次感谢。
我们可以使用split
拆分为data.frame
个list
(假设'scores_df'和'scores'具有相同的维度)
lst1 <- split(scores_df, scores$Country)