我还是R的新手,可能已经让数据框架的概念完全搞砸了。
但是我有一个csv文件,格式如下:
ID;Year;Title;Authors;Keywords;
作者和关键字应该是字符串列表。 E.g。
1; 2013;基于SOA和云的动态非突出性健康监测; Mohammed Serhani,Abdelghani Benharret,Erlabi Badidi;电子健康,疾病,监测,预防,SOA,云,平台,m-tech; < / p>
有没有办法将此csv文件读入R中,以便将作者和关键字的数据框列构建为列表列表?这是否需要我以特定方式格式化csv文件?
使用以下选项读取csv
articles <- read.csv(file="ls.csv",head=TRUE,sep=";",stringsAsFactors=F)
将Authors colum作为包含字符实例的列表生成。但我想要实现的是在作者列中的每个字段中获取一个字符列表。
答案 0 :(得分:2)
您是说您的文件包含由分号分隔的五个变量(ID,年份,标题,作者,关键字)?然后,根据定义,它不是一个csv文件!请记住,csv代表逗号 - 分隔值。有人把它命名为搞砸了。
您可以使用read.table
:
articles <- read.table("ls.csv", header=TRUE, sep=";", stringsAsFactors=FALSE)
答案 1 :(得分:0)
我认为您不能在data.frame中的列作者和关键字中列出项目列表类型,因为data.frame的列不能是一个列表。如果为data.frame提供了一个列表,则会将其分解为列组件。在您的情况下,它将无法工作,因为会有不同数量的作者和/或关键字:
# Works
data.frame(a=list(first=1:3, second=letters[1:3]), b=list(first=4:6, second=LETTERS[1:3]))
# a.first a.second b.first b.second
#1 1 a 4 A
#2 2 b 5 B
#3 3 c 6 C
# Does not work
data.frame(a=list(first=1:3, second=letters[1:2]), b=list(first=4:6, second=LETTERS[1:6]))
#Error in data.frame(first = 1:3, second = c("a", "b"), check.names = FALSE, :
# arguments imply differing number of rows: 3, 2
但是由于列表可能包含列表,您可以尝试将数据帧分解为此类。 'example.txt'的内容:
ID;Year;Title;Authors;Keywords;
1;2013;Towards Dynamic Non-obtrusive Health Monitoring Based on SOA and Cloud;Mohammed Serhani, Abdelghani Benharret, Erlabi Badidi;E-health, Diseases, Monitoring, Prevention, SOA, Cloud, Platform, m-tech;
2;1234;Title2;Author1, Author2;Key1, Key2, Key3;
3;5678;Title3;Author3, Author4, Author5;Key1, Key2, Key4;
以下是如何操作的示例:
x <- scan("example.txt", what="", sep="\n", strip.white=TRUE)
y <- strsplit(x, ";")
# Leave out the header
dat <- y[-1]
# Apply a function to every element inside the highest level list
dat <- lapply(dat,
FUN=function(x) {
# Splits in authors and keywords list
ret <- strsplit(x, ",");
# Remove leading and trailing whitespace
ret <- lapply(ret, FUN=function(z) gsub("(^ +)|( +$)", "", z));
# Assign names to all the fields
names(ret)<-unlist(y[1]);
ret
}
)
输出:
> str(dat)
List of 3
$ :List of 5
..$ ID : chr "1"
..$ Year : chr "2013"
..$ Title : chr "Towards Dynamic Non-obtrusive Health Monitoring Based on SOA and Cloud"
..$ Authors : chr [1:3] "Mohammed Serhani" "Abdelghani Benharret" "Erlabi Badidi"
..$ Keywords: chr [1:8] "E-health" "Diseases" "Monitoring" "Prevention" ...
$ :List of 5
..$ ID : chr "2"
..$ Year : chr "1234"
..$ Title : chr "Title2"
..$ Authors : chr [1:2] "Author1" "Author2"
..$ Keywords: chr [1:3] "Key1" "Key2" "Key3"
$ :List of 5
..$ ID : chr "3"
..$ Year : chr "5678"
..$ Title : chr "Title3"
..$ Authors : chr [1:3] "Author3" "Author4" "Author5"
..$ Keywords: chr [1:3] "Key1" "Key2" "Key4"
# Keywords of first item
> dat[[1]]$Keywords
[1] "E-health" "Diseases" "Monitoring" "Prevention" "SOA"
[6] "Cloud" "Platform" "m-tech"
# Title of second item
> dat[[2]][[3]]
[1] "Title2"
# Traveling inside the list of lists, accessing the very last data element
> lastitem <- length(dat)
> lastfield <- length(dat[[lastitem]])
> lastkey <- length(dat[[lastitem]][[lastfield]])
> dat[[lastitem]][[lastfield]][[lastkey]]
[1] "Key4"
请注意,列表列表可能是将数据存储在R中的低效方式,因此如果您有大量数据,则可能需要采用更有效的方法,例如:访问密钥是您的ID的关系数据库结构,假设它是唯一的。