【发布时间】:2016-07-30 03:23:30
【问题描述】:
我正在从 csv 文件中读取数据,其中每一行都包含一些单独的字符串:
例如
data.csv ->
x,f,t,h,b,g
d,g,h
g,h,a,s,d
f
q,w,e,r,t,y,u,i,o
data <- read.csv("data.csv", header = FALSE)
我想将此输入转换为数据框,其中列是输入中存在的唯一字符串集。在这种情况下,列将是字符串集{x,f,t,h,b,g,d,a,s,q,w,e,r,y,u,i,o}。此外,新数据框应为输入数据框中的每一行包含一行,这样如果列的名称存在于输入数据框中的该行中,则该列将具有值 1,或者如果该输入行中不存在列的名称。
在本例中,所需的输出如下:
x f t h b g d a s q w e r y u i o
----------------------------------
1 | 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
2 | 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0
3 | 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0 0
4 | 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
5 | 0 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1
下面的代码是我目前拥有的。但是,输出 df 最终成为一个数据框,其中包含正确的列,但 0 行。
我在 R 方面非常缺乏经验,这是我尝试组合一些可行的东西。在调用apply() 之前,它似乎按预期工作,这出乎意料地没有向df 添加任何内容。
data <- read.csv("data.csv", header = FALSE)
columnNames = c()
for (row in data) {
for (eventName in row) {
if (!(eventName %in% columnNames)) {
columnNames = c(columnNames, eventName)
}
}
}
columnNames = t(columnNames)
df = data.frame(columnNames)
colnames(df) = columnNames
df = df[-1,]
apply(data, 1, function(row, df) {
dat = data.frame(columnNames)
colnames(dat) = columnNames
dat = dat[-1,]
for (eventName in row) {
if (eventName != "") {
dat[1,eventName] = 1
}
}
df = rbind(df, dat)
}, df)
脚本完成后,它告诉我有以下两种形式的许多警告:
9: In `[<-.factor`(`*tmp*`, iseq, value = 1) : invalid factor level, NA generated
10: In `[<-.factor`(`*tmp*`, iseq, value = 1) :
invalid factor level, NA generated
【问题讨论】:
-
请使用
dput显示数据集。您的输入令人困惑。 -
我只是表明输入是一个标准的逗号分隔的 csv 文件,由
read.csv转换 -
好的,如果所有这些都是单个字符串,我就更新了帖子。
标签: r dataframe apply data-extraction