【问题标题】:Read data stored as character读取存储为字符的数据
【发布时间】:2016-10-20 05:54:58
【问题描述】:

我在数据框中有一列,其数字如下所示

      City                Temperature
      Edmonton, Alberta   4.1,13.6,15.2,15.7,14.2,15.2,16,14.2,17,13.1
      Edmonton, Alberta   15,18.2,14.8,16.5,14.6,16.9,14.3,17.5,13,15.8
      Edmonton, Alberta   15.8,17.9,16.9,15.1,13.2,13.1,16.8,12.4,14.7,15.6
      Edmonton, Alberta   14.3,17.3,14.6,17.3,14.8,14,15.4,14.1,16,15.4

我的目标是读取Temperature 列中的数据并创建两个额外的列来存储最低和最高温度,就像这样。

      City                Temperature                                         Min      Max
      Edmonton, Alberta   4.1,13.6,15.2,15.7,14.2,15.2,16,14.2,17,13.1        4.1      16
      Edmonton, Alberta   15,18.2,14.8,16.5,14.6,16.9,14.3,17.5,13,15.8       13       18.2
      Edmonton, Alberta   15.8,17.9,16.9,15.1,13.2,13.1,16.8,12.4,14.7,15.6   12.4     17.9
      Edmonton, Alberta   14.3,17.3,14.6,17.3,14.8,14,15.4,14.1,16,15.4       14.1     17.3

我尝试了简单的min(df$Temperature[1]) 函数,但没有成功。所以不知道如何处理这些数据,非常感谢任何建议或建议。

【问题讨论】:

标签: r summarization


【解决方案1】:

scan 函数可以读取文本字段并解析除以“sep”参数的值:

> dat$min_temp <- sapply( as.character(dat$Temperature), 
                    function(x) min( as.numeric( scan( text=x, sep=",", what=""))))
Read 10 items
Read 10 items
Read 10 items
Read 10 items
> dat
              City                                       Temperature
1 Edmonton,Alberta      4.1,13.6,15.2,15.7,14.2,15.2,16,14.2,17,13.1
2 Edmonton,Alberta     15,18.2,14.8,16.5,14.6,16.9,14.3,17.5,13,15.8
3 Edmonton,Alberta 15.8,17.9,16.9,15.1,13.2,13.1,16.8,12.4,14.7,15.6
4 Edmonton,Alberta     14.3,17.3,14.6,17.3,14.8,14,15.4,14.1,16,15.4
  min_temp
1      4.1
2     13.0
3     12.4
4     14.0

【讨论】:

  • 啊扫描功能,我知道由于某种原因我无法连接。谢谢 42,
【解决方案2】:

我们需要将'Temperature'列split','转换成numeric,得到rangerbind它并创建两列

df1[c("Min", "Max")] <- do.call(rbind, lapply(strsplit(as.character(df1$Temperature), ','), 
                        function(x) range(as.numeric(x))))

仅当“温度”列是factor 类时才需要as.character

【讨论】:

  • 这行得通,但我使用上面 42 建议的扫描功能只是因为我可以在需要时使用扫描功能轻松添加其他汇总统计信息,例如我不确定如何在需要时包含平均值未来使用这种方法,但我与扫描功能关系很好。
  • @DiggyDetroit 对于一般情况,你可以做function(x) {x1 &lt;- as.numeric(x); c(range(x), mean(x))})) 也改变df1[c("Min", "Max", "Mean")] &lt;-
猜你喜欢
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多