0

我有两个 csv 文件。一个包含多个点的测量值,一个包含单个点的描述。它有大约 100 个不同的点和 10000 个测量值,但为简化起见,我们假设只有两个点和测量值。

数据.csv:

point1,point2,date
25,80,11.06.2013
26,70,10.06.2013

描述.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
  }
}

所以,我现在的问题是:有没有办法在没有循环的情况下做到这一点?您是否会像我一样更改名称以提高可读性?如果不是,为什么?

4

2 回答 2

2

替换的技巧有时是匹配 hte 赋值两侧的索引:

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”以在空间限制内折叠文本。

于 2013-06-11T16:30:11.157 回答
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))]

感谢大家为我找到一个好的解决方案做出贡献!

于 2013-06-14T13:10:30.693 回答