将数据帧转换为二进制数据帧,其中每个唯一值是一列

时间:2016-07-30 03:23:30

标签: r dataframe apply data-extraction

我正在读取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

1 个答案:

答案 0 :(得分:3)

我们可以mtabulate split之后使用, library(qdapTools) mtabulate(strsplit(as.character(df1[,1]), ","))

base R

split,方法排在list之后,将list输出的名称设置为行序列,转换{{1} } data.framestack),更改&#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