我有两个csv文件。一个包含多个点的测量值,一个包含单个点的描述。它有大约100个不同的点和10000的测量值,但为了简化,我们假设只有两个点和测量值。
data.csv:
point1,point2,date
25,80,11.06.2013
26,70,10.06.2013
description.csv:
point,name,description
point1,tempA,Temperature in room A
point2,humidA,Humidity in room A
现在我将两个csv读入数据帧。然后我更改数据框中的列名称,使其更具可读性。
options(stringsAsFactors=F)
DataSource <- read.csv("data.csv")
DataDescription <- read.csv("description.csv")
for (name.source in names(DataSource))
{
count = 1
for (name.target in DataDescription$point)
{
if (name.source == name.target)
{
names(DataSource)[names(DataSource)==name.source] <- DataDescription[count,'name']
}
count = count + 1
}
}
所以,我现在的问题是:有没有办法在没有循环的情况下做到这一点?你会改变名字的可读性吗?如果没有,为什么?
答案 0 :(得分:2)
替换的技巧有时与匹配任务的两侧的索引相匹配:
names(DataSource)[match(DataDescription$point, names(DataSource))] <-
DataDescription$name[match(DataDescription$point, names(DataSource))]
#> DataSource
tempA humidA date
1 25 80 11.06.2013
2 26 70 10.06.2013
早期的努力:
names(DataSource)[match(DataDescription$point, names(DataSource))] <-
gsub(" ", "_", DataDescription$description)[
match(DataDescription$point, names(DataSource))]
#> DataSource
Temperature_in_room_A Humidity_in_room_A date
1 25 80 11.06.2013
2 26 70 10.06.2013
请注意,我没有在该数据帧上放置非语法名称。这样做本来是一种伤害。 Anando Mahto的评论得到了充分考虑。我不想这样做,除非它是数据处理的终点或者在绘图工作的路上进行的一次偏移。在那种情况下,我可能不会替换下划线。在你想要绘制标签的情况下,可能还需要插入“\ n”来在空间约束内折叠文本。
答案 1 :(得分:0)
# set options to get strings right
options(stringsAsFactors=F)
# read in original data
DataOriginal <- read.csv("data.csv", sep = ";")
DataDescriptionOriginal <- read.csv("description.csv", sep = ";")
# sort the data
DataOrdered <- DataOriginal[,order(names(DataOriginal))]
DataDescriptionOrdered <- DataDescriptionOriginal[order(DataDescriptionOriginal$points),]
# copy data into final dataframe and replace names
Data <- DataOrdered
names(Data)[match(DataDescriptionOrdered$points, names(Data))] <- gsub(" ", "_", DataDescriptionOrdered$description)[match(DataDescriptionOrdered$points, names(Data))]
对于为我找到一个好的解决方案的每个人都有很多帮助!