如何在SAS / R中导入单列圆柱形多个观测数据?

时间:2016-01-19 12:33:38

标签: r csv sas

有一个给定的虚拟数据集。我正在尝试将其导入SAS环境,我也在RStudio中尝试过它。但我无法抓住正确的输出。提供的数据集如下:

1    "name, age, salary, zipcode"
2    "A, 1, 100, 10010 B, 2, 200, 10011 C, 3, 300, 10012 D, 4, 400, 10014"

我从CSV文件中复制了数据。第1行位于CSV的第一个单元格中,第2行位于第一个单元格下方的第二个单元格中。

PS:10010是邮政编码,其中B是名称,B是下次观察的开始,类似地C是下一个观察,D是下一个观察。

所需的输出是:

Name   Age   Salary   Zipcode
 A      1     100      10010
 B      2     200      10011
 C      3     300      10012
 D      4     400      10014

我从一天前就遇到了这个问题。我只能在数据集周围移动以移动观察结果。此外,双重值使得这个问题变得非常复杂。 SAS或R上的工作解决方案可以很好地工作。

编辑:我在SAS中尝试了以下代码。感谢SMW的指点。 :)

data new;
length Name $2 Age 8. Salary 8. Zipcode 8.;
infile 'book1.csv' dsd dlm = ',' firstobs = 2 LRECL =17 ;
input Name $ Age Salary Zipcode @@;
run;

此致

2 个答案:

答案 0 :(得分:3)

导入列名并准备

nam <- read.table("csv.csv", header=F, nrow=1, stringsAsFactors=F)
nam <- gsub(",", "", nam)
nam <- nam[2]                             # resolve " " in original data 
nam <- strsplit(nam, split=" ")           #

将大小名称大写

library(Hmisc)                   # edited
nam <- capitalize(nam)           # edited

导入剩余文件

dd <- read.table("csv.csv", skip=1, sep="", stringsAsFactors=F)

重新排序文件,提取第一列

col_1 <- gsub(",", "", as.vector(dd[seq(from=1, to=16,by=4)])[1,])

提取剩余的列

col_all <- as.data.frame(t(matrix(dd, ncol=4)))

清除逗号

col_all <- apply(apply(col_all[-1], 2, gsub, patt=",", replace=""), 2, as.numeric)

并设置最终对象

data <- as.data.frame(cbind(col_1, col_all))
names(data) <- nam
data  # ouput

  Name Age Salary Zipcode
1    A   1    100   10010
2    B   2    200   10011
3    C   3    300   10012
4    D   4    400   10014

已编辑:仅使用基本功能进行大写。避免使用library(Hmisc)和以下代码行。

nam <- unlist(lapply(nam, function(x) {                    
   paste(toupper(substring(x, 1, 1)), substring(x, 2, max(nchar(nam))), sep="")
}))

答案 1 :(得分:0)

您可以要求SAS将逗号,空白和引用视为分隔符,并使用trail @@允许它从一行读取多个观察值。

让我们构建您的示例数据文件。

filename example temp;
data _null_;
  file example;
  put '"name, age, salary, zipcode"'
    / '"A, 1, 100, 10010 B, 2, 200, 10011 C, 3, 300, 10012 D, 4, 400, 10014"'
 ;
run;

现在看了。

data want;
  length Name $2 Age 8. Salary 8. Zipcode 8.;
  infile example dlm = ' ,"' firstobs = 2 ;
  input Name $ Age Salary Zipcode @@;
run;