R:更改列名以改进文档

时间:2013-06-11 15:59:09

标签: r

我有两个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
  }
}

所以,我现在的问题是:有没有办法在没有循环的情况下做到这一点?你会改变名字的可读性吗?如果没有,为什么?

2 个答案:

答案 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))]

对于为我找到一个好的解决方案的每个人都有很多帮助!