在R中匹配数据

时间:2014-04-03 08:38:23

标签: r for-loop automation

我有一个如下所示的数据集:

    temperature station.id  latitude    longtitude  sea.distance    altitude
1       18          S1           0.5        0.5              0.5        0
2       20.5        S1           0.5        0.5              0.5        0
3       18          S2           0.5        0.5              0.5        0
4       18.6        S2           0.5        0.5              0.5        0
5       21.5        S3           0.5        0.5              0.5        0
6       20.1        S3           3.5        2.5              1.5        200
7       18.3        S3           3.5        2.5              1.5        200
8       16.8        S4           3.5        2.5              1.5        200

将其视为制表符分隔文件,其中R由read.table读取,依此类推。我希望能够根据station.id列值自动对值进行分组。

示例:

要为S1创建一个像S1temp <- c(18, 20.5)这样的变量,其中包含temperature值的字符串。

这个想法是数据经常会发生变化,并且必须自动检测到变化。这就是为什么,上面的例子不会这样做。

我认为需要for循环。争论应该是什么?

感谢。

3 个答案:

答案 0 :(得分:1)

使用data.table的一种方法(让我们调用你的data.frame DF)

library(data.table)
DT <- data.table(DF)
DT2 <- DT[,list("temps"=paste(temperature,collapse=", ")),by=station.id]

结果是第一列中的唯一station.id表和第二列中的temps字符串。

答案 1 :(得分:0)

以下是两个建议 - 可能有更优雅的解决方案。

方法1.对station.id变量的值进行循环,并使用这些数据创建新的data.frame,在当前环境中创建新变量。缺点是可能会产生许多变量。

for(y in unique(df$station.id)){
    assign(sprintf('%sdf',y),subset(df,station.id == y))
}

方法2.使用lapply列出相应索引下给定station.id值的所有数据的值。

results <- lapply(unique(df$station.id),function(y) subset(df,station.id == y))
names(results) <- unique(df$station.id)

答案 2 :(得分:0)

最简单的方法之一是使用plyr包:

require(plyr)
station <- ddply(df, .(station.id), summarise, temps = paste(temperature,collapse=","))

这会为您提供第一列中包含station的新数据框station.id和第二列中的温度字符串。