【问题标题】:how to extract two columns of data using R by loop如何使用R循环提取两列数据
【发布时间】:2015-06-02 00:23:45
【问题描述】:

我有一个包含 1000 列数据的数据框

 str(MT)
 'data.frame':  1356 obs. of  1000 variables:
 $ Date : Factor w/ 1356 levels "Apr-1900","Apr-1901",..: 453 340 792 1 905  679 566 114 1244 1131 ...
 $ Year : int  1900 1900 1900 1900 1900 1900 1900 1900 1900 1900 ...
 $ X1   : num  -27.4 -27.8 -17 1.7 7.9 ...
 $ X2   : num  -27.21 -27.99 -17.05 1.69 7.75 ...
 $ X3   : num  -26.67 -27.84 -16.75 2.24 7.82 ...
 $ X4   : num  -26.64 -27.98 -16.83 2.46 7.97 ...
  .....
 $ X1000  : num  -29.13 -30.61 -20.47 -0.46 6.5

我想使用循环将此数据框拆分为三列(日期、年份和 Xn),这样最后我将拥有 1000 个带有 3 列数据的单独 csv 文件。到目前为止,我的代码是

for (i in ncol(MT)) {
x[[i]]<-data.frame(MT$Date, Year, MT$[[i]]) }

但是,给了我错误。您的指导将不胜感激,因为我是 R 的新手

【问题讨论】:

标签: r loops dataframe multiple-columns


【解决方案1】:

您的代码有一些语法和算法错误:

  1. 您的 for 循环没有循环通过一系列值,它为 i = ncol(MT)“循环”一次,它应该是 (i in 1:ncol(MT))
  2. 实际上,您不应该遍历所有列,因为其中两个不是Xn,所以(i in 1:(ncol(MT)-2))
  3. 不清楚您是否这样做,但您应该在尝试为其分配数据之前创建x,最好使用其最终大小;
  4. 您没有使用MT$ 选择Year 列;
  5. 您同时使用了$[[ 来对Xn 列进行子集化。您应该只使用[,因为这样您就可以使用i 并保留列名。

通过一些示例数据修复所有这些问题,您将获得:

MT <- data.frame(Date = rnorm(5), Year = rnorm(5), X1 = rnorm(5), X2 = rnorm(5), X3 = rnorm(5))

nX <- ncol(MT)-2

listofdf <- lapply(1:nX, function(x) NULL)

for (i in 1:nX) {
  listofdf[[i]] <- data.frame(MT$Date, MT$Year, MT[i+2])
}

listofdf
# [[1]]
# MT.Date    MT.Year         X1
# 1 -0.94184053  1.0241134 -0.4329728
# 2  0.59637577 -0.6195477 -1.3011527
# 3  0.33474278  1.0628674 -0.8957239
# 4 -0.04328685  0.4275993 -0.7840214
# 5  0.78799652  0.5707058 -0.4243622
# 
# [[2]]
# MT.Date    MT.Year         X2
# 1 -0.94184053  1.0241134  2.2380838
# 2  0.59637577 -0.6195477 -0.9995170
# 3  0.33474278  1.0628674  0.3452450
# 4 -0.04328685  0.4275993 -1.0453718
# 5  0.78799652  0.5707058 -0.6292885
# 
# [[3]]
# MT.Date    MT.Year          X3
# 1 -0.94184053  1.0241134 -0.05293727
# 2  0.59637577 -0.6195477  0.84947635
# 3  0.33474278  1.0628674  1.17748809
# 4 -0.04328685  0.4275993  1.73233398
# 5  0.78799652  0.5707058 -0.61874653

如果您只是要将它们保存为 .csv 文件,则不必存储在列表中。相反,您可以使用:

for (i in 1:nX) {
  tempdf <- data.frame(MT$Date, MT$Year, MT[i+2])
  write.csv(tempdf, paste0("MT_subset_X", i, ".csv"))
}

【讨论】:

  • 也感谢您对 sytax erro 的指导,它有助于清理很多东西!真的很感激!
  • 不客气。我的建议是在编写代码时逐个测试每个函数调用(控制台非常适合),这样你就可以在编写代码时发现语法错误,并检查输出是否是你的预计。
【解决方案2】:

重用@Molx 创建的样本数据,并按照@Neal Fultz 在 cmets 中的建议进行一些重塑,使用tidyr

# generate sample data
MT <- data.frame(Date = rnorm(5), Year = rnorm(5), X1 = rnorm(5), X2 = rnorm(5), X3 = rnorm(5))

然后将除DateYear 之外的所有变量和值拟合为键值列对

> require(tidyr)
> MTg <- gather(MT, var, value, -c(Date, Year))
> MTg
         Date       Year var       value
1  -1.5356474 -1.0963886  X1 -0.74075807
2  -1.1346928  0.2925819  X1  1.42787059
3   0.7031032  0.3361561  X1 -0.27112156
4   1.0140557  1.2587298  X1  0.85693377
5   0.2529787 -3.0113663  X1  0.12686607
6  -1.5356474 -1.0963886  X2  0.21406288
7  -1.1346928  0.2925819  X2 -1.11363330
8   0.7031032  0.3361561  X2 -0.30324978
9   1.0140557  1.2587298  X2  0.48954893
10  0.2529787 -3.0113663  X2  0.85898166
11 -1.5356474 -1.0963886  X3 -0.44394680
12 -1.1346928  0.2925819  X3 -0.86942530
13  0.7031032  0.3361561  X3 -1.62344294
14  1.0140557  1.2587298  X3  0.09880026
15  0.2529787 -3.0113663  X3 -0.76091871

然后遍历所有可能的变量名,将它们导出到与 var 同名的单个 csv 文件中。

varnames <- levels(MTg$var)  # get variable names
dummy <- lapply(varnames, function(x)
  write.csv(MTg[MTg$var==x,], file=paste0(x, ".csv"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 2019-02-22
    • 2012-10-04
    • 2014-03-21
    • 1970-01-01
    • 2020-12-07
    相关资源
    最近更新 更多