将列添加到数据框中,测试其他列中的分类变量

Posted

技术标签:

【中文标题】将列添加到数据框中,测试其他列中的分类变量【英文标题】:add column to data frame, testing categorical variable in other column 【发布时间】:2014-04-03 05:30:50 【问题描述】:

我已经提到:

How to add a factor column to dataframe based on a conditional statement from another column?, How to add column into a dataframe based on condition in R programming 和 R: Add column with condition-check on three columns? 。

所有示例均基于对其他列中的数字向量或 NA 的测试并添加新变量。这是一个简短的可重现示例:

x <- c("dec 12", "jan 13", "feb 13", "march 13", "apr 13", "may 13",
       "june 13", "july 13", "aug 13", "sep 13", "oct 13", "nov 13")
y <- c(234, 678, 534, 122, 179, 987, 872, 730, 295, 450, 590, 312)
df<-data.frame(x,y)

我想为df$x 添加“冬天” = dec |一月 |二月,三月|四月|五月的“春天”,“夏天”和“秋天”。

我试过了

df$season <- ifelse(df[1:3, ], "winter", ifelse(df[4:6, ], "spring", 
                    ifelse(df[7:9, ], "summer", "autumn")))

我知道这是一种非常低效的做事方式,但我是新手和笨蛋。它返回错误:

Error in ifelse(df[1:3, ], "winter", ifelse(df[4:6, ], "spring",
ifelse(df[7:9,  : (list) object cannot be coerced to type 'logical'

如果同一个数据框有数千行,并且我想遍历它并根据一年中的月份为季节创建一个新变量,我该怎么做?我提到:“Looping through a data frame to add a column depending variables in other columns”但这是循环并设置一个数学运算符来创建新变量。我尝试了外部资源:a thread on the R mailing list 和 a thread on the TalkStats forum。但是,两者都基于数字变量和条件。

【问题讨论】:

这个答案应该对你有所帮助:***.com/a/22124477/3283824 @beetroot,我只是在想同样的事情 ;-) 我会从Months &lt;- substr(df$x, 1, 3) 开始并将常量month.abb() 转换为小写(使用tolower)并从那里开始。 @beetroot 是的,当 r 将月份名称识别为 month.abb 但我们从中获取报告的数据库中,月份或日期列通常非常混乱时,这将起作用。我可以学习一个正则表达式来添加一个具有 R 原生日期格式的变量吗?还是我过于复杂了? @vagabond,这是一个有点不同的问题。我想说,第一步是将所有日期转换为通用格式。 【参考方案1】:

如果您有一个非常大的数据框,那么data.table 将对您非常有帮助。以下作品:

library(data.table)
x <- c("dec 12", "jan 13", "feb 13", "march 13", "apr 13", "may 13",
   "june 13", "july 13", "aug 13", "sep 13", "oct 13", "nov 13")
y <- c(234, 678, 534, 122, 179, 987, 872, 730, 295, 450, 590, 312)
df <-data.frame(x,y)
DT <- data.table(df)
DT[, month := substr(tolower(x), 1, 3)]
DT[, season := ifelse(month %in% c("dec", "jan", "feb"), "winter",
               ifelse(month %in% c("mar", "apr", "may"), "spring",
               ifelse(month %in% c("jun", "jul", "aug"), "summer", 
               ifelse(month %in% c("sep", "oct", "nov"), "autumn", NA))))]
DT
          x   y month season
1:   dec 12 234   dec winter
2:   jan 13 678   jan winter
3:   feb 13 534   feb winter
4: march 13 122   mar spring
5:   apr 13 179   apr spring
6:   may 13 987   may spring
7:  june 13 872   jun summer
8:  july 13 730   jul summer
9:   aug 13 295   aug summer
0:   sep 13 450   sep autumn
1:   oct 13 590   oct autumn
12:  nov 13 312   nov autumn

【讨论】:

行得通!谢谢。您在哪里发现了 data.table 包?绝对应该从源头做一些练习。 data.table 最近被我发现,几周前,因为这里的专家。太壮观了。 :D datatable.r-forge.r-project.org

以上是关于将列添加到数据框中,测试其他列中的分类变量的主要内容,如果未能解决你的问题,请参考以下文章

将列中的所有值复制到熊猫数据框中的新列

将列值分配给数据框中的变量

使用条件将列更改为单独的数据框

使用 R 中的多参数用户定义函数将列添加到数据框中

使用 Pandas 迭代地将列添加到数据框中

将列中的值转换为现有数据框中的行名