如何将具有多个数字的列转换为一系列虚拟变量?

时间:2015-09-15 16:00:05

标签: database excel transformation

我需要将一些数据转换为关系数据库。在数据库实体中,有一系列21个是/否变量。在当前格式中,有一列包含一系列数字,用空格分隔,每一列对应一个"是"对于那个变量。

例如,该列可能会读取" 3 7 12 20",这对应于"是"对于变量3,7,12和20,以及" No"为所有其他人。

我需要将该列转换为虚拟变量格式。我知道我可以使用" Text to Columns" excel中的工具用于分隔列中的数字。但就我而言,这就是我的意思。如何告诉软件数字列对应于某列的某个值?

我希望在Excel中这样做,但也开始熟练使用SQL和Stata。

谢谢!

2 个答案:

答案 0 :(得分:0)

这是在Excel中执行此操作的一种方法。如果您的A列中的当前数据从A2开始,B1:V1中的数字1到21,则在B2中输入以下公式并向右和向右填充根据需要:

=OR(NOT(ISERROR(FIND(" " & B$1& " ",$A2))),LEFT($A2,LEN(B$1)+1)=TEXT(B$1,"@") & " ",RIGHT($A2,LEN(B$1)+1)=" " & TEXT(B$1,"@"),TRIM($A2)=TEXT(B$1,"@"))

这测试四种情况之一:

  1. 我们正在寻找的价值(即相关栏目中的价值) 在第一行),左侧有一个空格,可以在中找到 A列中的单元格(FIND(" " & B$1& " ",$A2)不是错误);或
  2. 我们要查找的值加上一个尾随空格(TEXT(B$1,"@") & " ")是A列中单元格中的第一个内容(LEFT($A2,LEN(B$1)+1));或
  3. 我们正在寻找的值加上一个前导空格,是A列单元格中的最后一个。
  4. 我们正在寻找的值是A列单元格中唯一的东西。

答案 1 :(得分:0)

虽然您没有提及它,但我想在R中提供解决方案。假设以下源数据:

enter image description here

# Load the needed package, load the workbook containing the input data and read the sheet
library(xlsx) 
wb <- loadWorkbook(file="currentFormat.xlsx")
input <- read.xlsx(file="currentFormat.xlsx", sheetIndex=1, startRow=2, header=FALSE, colIndex=1)

# Number of individuals/observations/rows
N <- nrow(input)

# Prepare output data matrix
output <- matrix(0, ncol=21, nrow=N)

# Get 'Yes' answers for each i in N
true <- apply(X=input, 1,FUN=function(z) {as.numeric(unlist(strsplit(z, fixed = TRUE, split = " "))) } )

# Fill the output matrix
for(i in 1:N) {
  output[i, true[[i]]] <- 1
}

# Write output spreadsheet
write.xlsx(x = as.data.frame(output), file = "dummyData.xlsx", sheetName = "Output", row.names = TRUE)

代码不是很漂亮但它确实想要你(我猜): enter image description here