我需要将一些数据转换为关系数据库。在数据库实体中,有一系列21个是/否变量。在当前格式中,有一列包含一系列数字,用空格分隔,每一列对应一个"是"对于那个变量。
例如,该列可能会读取" 3 7 12 20",这对应于"是"对于变量3,7,12和20,以及" No"为所有其他人。
我需要将该列转换为虚拟变量格式。我知道我可以使用" Text to Columns" excel中的工具用于分隔列中的数字。但就我而言,这就是我的意思。如何告诉软件数字列对应于某列的某个值?
我希望在Excel中这样做,但也开始熟练使用SQL和Stata。
谢谢!
答案 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,"@"))
这测试四种情况之一:
FIND(" " & B$1& " ",$A2)
不是错误);或TEXT(B$1,"@") & " "
)是A列中单元格中的第一个内容(LEFT($A2,LEN(B$1)+1)
);或答案 1 :(得分:0)
虽然您没有提及它,但我想在R中提供解决方案。假设以下源数据:
# 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)