我有一个简单的文本文件,其中第一列是名称(字符串),第二列是值(浮点数)。例如,姓名和年龄:
Name, Age
John, 32
Heather, 46,
Jake, 23
Sally, 19
我希望将其作为数据框(请调用此df
)进行阅读,但转置为可以按姓名访问年龄,以便df$John
返回32
。我怎么能这样做?
上一篇文章我尝试创建一个新的数据框tdf
,循环遍历for
循环中的数据,分配每个name
和age
,然后插入空数据框如tdf[name] = age
但这没有按照我的预期发挥作用。
答案 0 :(得分:2)
您可以使用read.table()
来阅读数据。
然后你可以使用t()
转置它并在之后设置colnames。
示例:
如果df是:
df=read.table("dummydata", header=T, sep=",")
df
Name Age
1 John 32
2 Heather 46
3 Jake 23
4 Sally 19
您转换年龄,然后将其转换为数据框:
tdf=as.data.frame(t(df$Age))
colnames(tdf)=t(df$Name)
所以tdf会返回:
tdf
John Heather Jake Sally
1 32 46 23 19
而且,正如你所问,tdf $ John将返回:
tdf$John
[1] 32
现在,如果您有两个以上的列,您可以执行相同的操作,但不是指示列的名称,而只需使用括号指示位置。
df=read.table("dummydata", header=T, sep=",")
使用t(df [2:ncol(df)])无论列数如何,都可以从第二列开始转置整个表格。第一列将是转置后的名称。
tdf=as.data.frame(t(df[2:ncol(df)]))
然后设置列名。
colnames(tdf)=t(df[1])
tdf$John
[1] 32
答案 1 :(得分:0)
将数据读入数据框DF
(见注)。
1)将名称分配给DF
的行,在这种情况下,这将为John提供年龄,而无需创建新的数据结构:
rownames(DF) <- DF$Name
DF["John", "Age"]
## [1] 32
2)或者,将DF
拆分为命名列表,在这种情况下,您可以获得所需的精确语法:
ages <- with(DF, split(Age, Name))
ages$John
## [1] 32
3)此替代方案也会创建相同的列表:
ages <- with(DF, setNames(as.list(Age), Name))
注意: DF
的可重现形式如下。 (我们已在问题的一行中删除了尾随逗号,但如果确实存在,请在read.csv
行添加fill = TRUE。)
Lines <- "Name, Age
John, 32
Heather, 46
Jake, 23
Sally, 19"
DF <- read.csv(text = Lines)
答案 2 :(得分:0)
当您从文件
中读取时,这应该将该行添加为标题read.csv2(filename, as.is = TRUE, header = TRUE)