我正在R中使用一个数据集。这个数据集包含一些值列和一些城市列,每个城市都是虚拟变量(0和1)。数据集如下所示:
df<-data.frame(A=c(1,2,2,3,4,5,1,1,2,3,4,4),
B=c(4,4,2,3,4,2,1,5,2,2,5,1) ,
C=c(rep(0:1, each=3, times=2)),
D=round(rnorm(12, mean=50, sd=10), 2) ,
City1=c(rep(0:1, each=6)),
City2=c(rep(c(1, 0), c(6,6))))
上面的数据集是一个原型。真实的的数据集有不同数量的“城市”变量,即有时一个数据集有2个“城市”列,有时它有10个“城市”列。我想要一个解决方案,我可以根据每个“城市”的值创建单独的数据集。例如,代码基于“1”值创建数据集(非“0”值)并存储在名为“City1”的 Dataframe 中。然后,转到列“City2”并基于列“City2”中的“1”值(不是“0”值)创建数据集,并存储在名为“City2”的单独 Dataframe 中。
我知道下面的一些代码可以完成这项工作,但这样一来,我每次都必须根据“城市”变量的名称来编写代码,而且每个数据集中的城市数量也不同。
df1 <- df[df$City1==1,]
df2 <- df[df$City2==1,]
有人能帮我解决这个问题吗?先谢谢你。
4条答案
按热度按时间dy1byipe1#
识别城市列,然后循环通过它们并 * 拆分 *:
**编辑:**要将列表作为单独的 Dataframe 输出到环境中,我们需要命名列表项,然后使用 list2env:
odopli942#
这里有一个使用
purrr::map
和rlang::bind_env
的方法。这会在全局环境中创建df1
和df2
,注意不要覆盖现有对象!如果你只想要一个data.frame
的列表,那么就停止使用map
。数据来自OP
由reprex package(v2.0.1)于2023年3月7日创建
pbpqsu0x3#
您可以
paste
列,然后split
:或者,对于
pivot_longer
:如果要在全局环境中将列表转换为多个数据框,请使用
list2env(your_list, .GlobalEnv)
。bf1o4zei4#
您可以使用
startsWith
为以 City 开头的列设置df
的子集,测试它们是否等于1== 1
,并获得这样的列,其中max.col
.Paste
df 位于列的前面,并将其用于split
df
。使用list2env
获得全局环境中的data.frames
。如果要将其保存在列表中,并假设城市仅编码为0或1,您可以尝试:
或者使用
lapply
和子集df
。基准