r - 将data.frame列从因子转换为字符

我有一个数据框。 我们叫他bob:

> head(bob)

phenotype exclusion

GSM399350 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-

GSM399351 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-

GSM399352 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-

GSM399353 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-

GSM399354 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-

GSM399355 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-

我想连接这个数据框的行(这将是另一个问题)。 但看:

> class(bob$phenotype)

[1] "factor"

bob的列是因子。 所以,例如:

> as.character(head(bob))

[1] "c(3, 3, 3, 6, 6, 6)" "c(3, 3, 3, 3, 3, 3)"

[3] "c(29, 29, 29, 30, 30, 30)"

我没有开始理解这一点,但我想这些是bob的列(因为caractacus法院)的因素水平的指数? 不是我需要的。

奇怪的是,我可以手工完成bob的栏目,并做

bob$phenotype

哪个工作正常。 并且,在进行一些输入后,我可以得到一个data.frame,其列是字符而不是因子。 所以我的问题是:我怎么能自动完成这个? 如何将带有因子列的data.frame转换为带有字符列的data.frame,而无需手动遍历每列?

奖金问题:为什么手动方法有效?

Mike Dewar asked 2019-02-08T08:24:25Z

13个解决方案

311 votes

就在马特和德克身上。 如果要在不更改全局选项的情况下重新创建现有数据框,可以使用apply语句重新创建它:

bob

这会将所有变量转换为类“字符”,如果您只想转换因子,请参阅下面的Marek解决方案。

正如@hadley指出的那样,以下内容更为简洁。

bob[]

在这两种情况下,lapply输出一个列表; 但是,由于R的神奇属性,在第二种情况下使用[]会保留bob对象的data.frame类,从而无需使用参数stringsAsFactors = FALSE将as.data.frame转换回data.frame。

Shane answered 2019-02-08T08:24:58Z

257 votes

仅替换因素:

i

bob[i]

在软件包dplyr中,版本0.5.0引入了新功能mutate_if:

library(dplyr)

bob %>% mutate_if(is.factor, as.character) -> bob

来自RStudio的包装purrr提供了另一种选择:

library(purrr)

library(dplyr)

bob %>% map_if(is.factor, as.character) %>% as_data_frame -> bob

(请记住它的新鲜包装)

Marek answered 2019-02-08T08:25:44Z

36 votes

全球选择

stringsAsFactors:       data.frame和read.table参数的默认设置。

可能是您要在启动文件中设置为FALSE的内容(例如〜/ .Rprofile)。 请参阅help(options)。

Dirk Eddelbuettel answered 2019-02-08T08:26:26Z

19 votes

我知道这个答案有点晚,但是如果你了解了因子的存储方式,你可以避免使用基于应用的函数来实现这一点。 这并不意味着应用解决方案效果不佳。

因素被构造为与“水平”列表相关联的数字索引。 如果将因子转换为数字,则可以看到这一点。 所以:

> fact

> fact

[1] a b a d

Levels: a b d

> as.numeric(fact)

[1] 1 2 1 3

最后一行返回的数字对应于因子的级别。

> levels(fact)

[1] "a" "b" "d"

请注意,levels()返回一个字符数组。 您可以使用此事实轻松,紧凑地将因子转换为字符串或数字,如下所示:

> fact_character

> fact_character

[1] "a" "b" "a" "d"

如果将表达式包装在as.numeric()中,这也适用于数值。

> num_fact

> num_fact

[1] 1 2 3 6 5 4

Levels: 1 2 3 4 5 6

> num_num

> num_num

[1] 1 2 3 6 5 4

Kikapp answered 2019-02-08T08:27:22Z

17 votes

如果需要新数据框bobc,其中bobf中的每个因子向量都将转换为字符向量,请尝试以下操作:

bobc

如果您想要将其转换回来,可以创建一个逻辑向量,其中列是因子,并使用它来选择性地应用因子

f

bobc[,f]

scentoni answered 2019-02-08T08:27:57Z

11 votes

我通常将此功能与我的所有项目区分开来。 快捷方便。

unfactorize

for(i in which(sapply(df, class) == "factor")) df[[i]] = as.character(df[[i]])

return(df)

}

by0 answered 2019-02-08T08:28:25Z

7 votes

另一种方法是使用apply转换它

bob2

还有一个更好的(前一个是'矩阵'类)

bob2

George Dontas answered 2019-02-08T08:29:00Z

6 votes

更新:这是一个不起作用的例子。 我认为它会,但我认为stringsAsFactors选项只适用于字符串 - 它只留下因素。

试试这个:

bob2

一般来说,每当你遇到应该是字符的因素的问题时,就会有一个stringsAsFactors设置来帮助你(包括全局设置)。

Matt Parker answered 2019-02-08T08:29:37Z

6 votes

或者你可以试试transform:

newbob

请务必将您想要转化的每个因素都转换为角色。

或者你可以做这样的事情,一击就杀死所有的害虫:

newbob_char

newbob_rest

newbob

在这样的代码中推送数据并不是一个好主意,我可以单独做transform部分(实际上,这样做要容易得多),但是你明白了......我没有检查过代码,' 因为我不在家,所以我希望它有效!=)

然而,这种方法有一个缺点...你必须重新组织列,而transform你可以做任何你喜欢的事情,但代价是“行人风格的代码写作”......

那么...... =)

aL3xa answered 2019-02-08T08:30:45Z

5 votes

在您的数据框的开头包括stringsAsFactors = FALSE忽略所有的误解。

answered 2019-02-08T08:31:14Z

3 votes

如果您将使用data.table程序包进行data.frame上的操作,则问题不存在。

library(data.table)

dt = data.table(col1 = c("a","b","c"), col2 = 1:3)

sapply(dt, class)

# col1 col2

#"character" "integer"

如果您已在数据集中有因子列,并且想要将它们转换为字符,则可以执行以下操作。

library(data.table)

dt = data.table(col1 = factor(c("a","b","c")), col2 = 1:3)

sapply(dt, class)

# col1 col2

# "factor" "integer"

upd.cols = sapply(dt, is.factor)

dt[, names(dt)[upd.cols] := lapply(.SD, as.character), .SDcols = upd.cols]

sapply(dt, class)

# col1 col2

#"character" "integer"

jangorecki answered 2019-02-08T08:31:55Z

2 votes

这对我有用 - 我终于找到了一个班轮

df

user1617979 answered 2019-02-08T08:32:26Z

1 votes

这个功能起到了作用

df

Cedric answered 2019-02-08T08:32:54Z

dataframe一列转化一个字符串_r - 将data.frame列从因子转换为字符相关推荐

  1. pandas使用pad函数向dataframe特定数据列的每个字符串添加后置(后缀)补齐字符或者字符串、向所有字符串的右侧填充、直到宽度达到指定要求(right padding)

    pandas使用pad函数向dataframe特定数据列的每个字符串添加后置(后缀)补齐字符或者字符串.向所有字符串的右侧填充.直到宽度达到指定要求(right padding) 目录

  2. Java黑皮书课后题第4章:4.20(字符串处理)编写一个程序,提示用户输入一个字符串,显示它的长度和第一个字符

    4.20(字符串处理)编写一个程序,提示用户输入一个字符串,显示它的长度和第一个字符 题目 题目概述 破题 代码 题目 题目概述 4.20(字符串处理)编写一个程序,提示用户输入一个字符串,显示它的长 ...

  3. 给定一个字符串str,将str中连续两个字符为a的字符替换为b(一个或连续超过多个字符a则不替换)...

    需求:给定一个字符串str,将str中连续两个字符为a的字符替换为b(一个或连续超过多个字符a则不替换) 如:  a 不替换  b 不替换  ab 不替换  ba 不替换  aba 不替换  aab ...

  4. 统计一个字符串中英文字母、空格、数字和其它字符的个数

    1 package demo; 2 import java.util.Scanner; 3 /** 4 * 统计一个字符串中英文字母.空格.数字和其它字符的个数 5 */ 6 public class ...

  5. 题目 给定一个字符串所表示的括号序列,包含以下字符: '(', ')', '{', '}', '[' and ']', 判定是否是有效的括号序列。 样例 括号必须依照 ()顺序表示, ()[]

    题目 给定一个字符串所表示的括号序列,包含以下字符: '(', ')', '{', '}', '[' and ']', 判定是否是有效的括号序列. 样例 括号必须依照 "()"顺序 ...

  6. AJPFX实列判断一个字符串是不是对称字符串

    import java.util.Scanner; /** 判断一个字符串是否是对称字符串 */ public class StringDemo { public static void main(S ...

  7. dataframe 添加一行_R语言Data Frame数据框常用操作

    来源 | R友舍 Data Frame一般被翻译为数据框,感觉就像是R中的表,由行和列组成,与Matrix不同的是,每个列可以是不同的数据类型,而Matrix是必须相同的. Data Frame每一列 ...

  8. 关于《输入一个字符串,内有数字和非数int字符,如a123x456,将其中连续的数作为一个整数,依次存放到整型数组a中》的一点看法

    最近刚刚学习了C基础这门课程,作到了这个习题,这个题目要求将字符串中的数字作为整数存放到整型数组中,这个题目有一个特点就是字符串中除了有数字还有非数int字符.看完题目,我顿时来了兴趣. 在一开始我选 ...

  9. 字符串 二进制数字 转换 java_如何将二进制数据转换为字符串并返回到Java中?

    String(byte[]) 将数据视为默认字符编码.因此,如何将字节从8位值转换为16位Java Unicode字符将不仅在操作系统之间发生变化,而且甚至可以在同一台机器上使用不同代码页的不同用户之 ...

最新文章

  1. 设计模式(六)------设计模式六大原则(5):迪米特法则
  2. tableau三轴该怎么做_如何用tableau绘制城市地铁线路图?
  3. 压缩可以卸载吗_番禺街坊注意!微信发送高清大文件不压缩,网友:QQ可以卸载了?...
  4. 明确职责分工的重要性_发挥属地作用明确责任分工
  5. linux系统安全(二): 日志(转)
  6. oracle 12g 无监听,Oracle 12.2监听无法启动解决一例
  7. 【C++】set和multiset区别
  8. SPEOS | SPEOS HUD 设计功能
  9. OpenStack报错:MessagingTimeout: Timed out waiting for a reply to message ID
  10. Photoshop设计精讲精练笔记(一)
  11. 有关PS中图片不能解锁问题
  12. C++ 线性表的结构体定义(顺序表和链式表)
  13. OKRs, How Google sets goals, Startup Lab workshop | Chatopera
  14. 迷你播放器--第一阶段(2)--退出时自动最小化(不是关闭),增加当前播放曲目的跑马灯效果
  15. IDEA,git单个指定文件分支间合并
  16. PHP使用socket TCP通信对接富途牛牛
  17. Java 蜡烛图_7-13 日K蜡烛图 - osc_9vrg5zhs的个人空间 - OSCHINA - 中文开源技术交流社区...
  18. Android4.4 往短信收件箱中插入自定义短信(伪造短信)
  19. 竞拍秒购电商系统开发需求和功能架构分析
  20. 管理经济学第一遍总结

热门文章

  1. day23 我的练习
  2. /sm/wx.php,出生日期查五行属性
  3. 抖音SEO搜索和源码程序开发及系统功能框架分析
  4. c语言用pow求x的y次幂,pow函数(数学次方)在c语言的用法,两种编写方法实例( 计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值)...
  5. 男性英文名字汉语意思大全
  6. 系统应用:Windows的故障恢复控制台应用实例详解
  7. 海量无损高音质音乐文件分享180TB(持续更新)
  8. 什么是GC对于GC垃圾回收机制的理解
  9. 形容词的比较级和最高级
  10. 【蓝牙模块】多主多从蓝牙模块介绍