【问题标题】:Make new dataframes from one level of a categorical variable in R?从R中的分类变量的一个级别制作新的数据框?
【发布时间】:2018-03-22 21:42:08
【问题描述】:
list2env(split(df, df[,1]), envir = .GlobalEnv)

我发现之前发布了这段代码,但问题是我的级别要么是数字,要么在单词之间有空格,我认为 R 不喜欢。因此,数据框出现在我的全局环境中,但我无法使用它们。当我对它们调用函数时,它们无法处理,并且它们不会显示在选项卡完成中。

我是 R 新手,所以我不确定如何很好地复制我的数据集。这是针对碰撞事故的 24 个变量的 14,000 个观测值。

Neighborhood <- c("Westboro", "Hintonburg", "Downtown", "Downtown")
AccidentType <- c("Fatal injury", "property damage", "property damage", "injury")

Neighborhood <- as.factor(Neighborhood)
AccidentType <- as.factor(AccidentType)
df <- data.frame(Neighborhood, AccidentType)

假设我只对财产损失感兴趣,并且想要一个仅显示财产损失事故的全新数据框。我也想将旧数据保留在其原始数据框中。

谢谢。抱歉,我的 R 太糟糕了。

编辑:cmets 中的所有方法都适用于示例数据集,但由于某种原因不是我的实际方法:(

当我尝试这些方法时,我得到了这个:

OttawaCollisions %>% filter(Collision_Classification=="Injury")
 [1] Record                   Location                 X                        Y                       
 [5] Date                     Time                     Environment              Road_Surface            
 [9] Traffic_Control          Collision_Location       Light                    Collision_Classification
[13] Impact_type              Seasons                  Holidays                 LunarPhase              
[17] DayofWeek                Accidents                Longitude                Latitude                
[21] Ward                     WardNumb                 NumText                  TimeCat                 
<0 rows> (or 0-length row.names)
> View(OttawaCollisions)
> subset(OttawaCollisions, Collision_Classification == "P.D. only")
 [1] Record                   Location                 X                        Y                       
 [5] Date                     Time                     Environment              Road_Surface            
 [9] Traffic_Control          Collision_Location       Light                    Collision_Classification
[13] Impact_type              Seasons                  Holidays                 LunarPhase              
[17] DayofWeek                Accidents                Longitude                Latitude                
[21] Ward                     WardNumb                 NumText                  TimeCat                 
<0 rows> (or 0-length row.names)

我不确定为什么会显示零行。这没有道理。我有很多数据(14,000 点),它们都转换为因子。当我对它们调用 str() 时,它们就出现了。呃。

【问题讨论】:

  • 只需将它们保存在单个数据框中,并在需要时过滤/子集出您想要的部分,或者只需执行split() 部分并按名称选择您想要的列表元素.
  • 请举个例子?实际上,我最终也确实需要由其中一些级别分隔的数据框。
  • 我的意思是你实际上没有。您可能希望引用名为data_subset 的独立数据框的任何实例都可以替换为内联子集或对split() 结果中的列表元素的引用。
  • df %&gt;% filter(AccidentType=="property damage") in dplyr 包将只挑选出满足该条件的行。 df 不仅不会被更改,而且您可以将整行通过管道传输到另一个命令中,例如df %&gt;% filter(AccidentType=="property damage") %&gt;% ggplot() +...
  • 在您的第一个示例中,您拼错了“injury”。

标签: r dataframe factors levels


【解决方案1】:

要明确在 cmets 中所说的内容,您可以过滤 data.frame :

在基础 R 中:

subset(df,AccidentType == "property damage")

使用 dplyr :

filter(df,AccidentType == "property damage")

如果过滤成本很高并且您只想进行一次(但如果您只有 14k 行则不是),您可以将您的 df 拆分为一个列表:

df_list <- split(df,df$AccidentType)

然后拨打df_list[["property damage"]]

因此,您不需要为每个 data.frame 使用单独的对象,因此不建议这样做。

【讨论】:

  • 谢谢大家。我在评论中进行了编辑。我认为我的数据有问题,但我不知道是什么。我得到行的零回报。
  • 原来我在某些关卡之前留下了一个空白字符,所以没有任何效果的原因是因为我必须输入类似“伤害”而不是“伤害”的内容。啊。
猜你喜欢
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多