我正在读取csv文件中的数据,其中每行包含一些单独的字符串:
e.g。
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
,如果该输入行中不存在列名,则为0
。
在此示例中,所需的输出如下:
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
答案 0 :(得分:3)
我们可以mtabulate
split
之后使用,
library(qdapTools)
mtabulate(strsplit(as.character(df1[,1]), ","))
base R
或split
将,
方法排在list
之后,将list
输出的名称设置为行序列,转换{{1} } data.frame
(stack
),更改&#39;值&#39;指定factor
的{{1}}列,然后使用levels
获取频率。
table
如果这不是一列,
table(transform(stack(setNames(strsplit(as.character(df1[,1]), ","), 1:nrow(df1)))[2:1],
values = factor(values, levels = unique(values))))
#
# 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
或者
mtabulate(apply(df2, 1, FUN = function(x) x[x!=""]))
as.data.frame.matrix(table(transform(stack(setNames(apply(df2, 1,
FUN = function(x) x[x!=""]),
1:nrow(df2)))[2:1], values = factor(values, levels = unique(values)))))
#
# 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