【问题标题】:.csv data manipulation in R rather than pythonR而不是python中的.csv数据操作
【发布时间】:2017-04-28 12:44:01
【问题描述】:

我有一个简单的 .csv 格式数据,需要先对其进行操作,然后才能根据该数据创建绘图。但是,我了解如何从 python 操作 .csv 格式的数据。我想在 R 中应用相同的逻辑,但我不知道该怎么做。

以下是来自 .csv 文件但加载到 R 中的示例数据。我已经创建了代码供我们讨论这个问题。

df <- data.frame(Name = c("AC", "AC", "PT", "PT", "OR", "OR"),
    useless_column = c("","","A",3,4," "),
  measurement = c("H", "", "K", "M", "", "H"),
  amount = c(12, 54, 20, 87, 75, 22),
    useless_column = c("","","A",3,4," ")) 

在python中,我一般会这样做:

import csv
import os
import glob
import sys
fileList = glob.glob("R:xxxxxxxxxxxxxxxxxxxxx\*.csv")
for inputFile in fileList:
        outputFilename = inputFile + "output.csv"
        csvInput = csv.reader(open(inputFile,'r'),delimiter=",")
        outputFile = open(outputFilename,'w')
        outputFile.write("Name,measurement,amount\n")
        csvInput.next()
        for line in csvInput:
            if line[2] == "H":
               meas = "100"
            elif line[2] == "K":
               meas = "1000"
            elif line[2] == "M":
               meas = "1000000"
            else:
               meas = "1"
            amount = int(meas) * line[3]

            outputFile.write(",".join(line[0],line[2],amount+"\n"]))
outputFile.close()

在 python 中,我可以加载 csv,然后使用 for 循环来识别 csv 文件中的每一行。然后在我继续分析之前定制我的输出文件。从上面,我希望我的输出如下所示,代码为 R 格式:

    df <- data.frame(Name = c("AC", "AC", "PT", "PT", "OR", "OR"),
  measurment = c("H", "", "K", "M", "", "H"),
  amount = c(1200, 54, 20000, 87000000, 75, 2200))

我想知道在 R 中执行此操作?我有一个小的 R 代码,请任何人都可以引导我进入正确的方向:

x <- read.csv("xxxx.csv", header=T,sep=",")
xC = ncol(x)
xR = nrow(x)
op = data.frame(matrix(data = x, nrow= xR, ncol=3,byrow=T))
for (x in :xC)
{
    for (r in 1:xR)
    {
    xxxxxxxx

    }

【问题讨论】:

    标签: python r csv


    【解决方案1】:

    在 R 中调整 Python 代码意味着放弃循环以支持向量化操作。在这里,我们可以根据命名向量创建 meas,然后计算数量:

    # dictionnary of measurement values:
    m <- c(H = 100, K = 1000, M = 1000000)
    
    # create meas based on measurement
    df$meas <- m[df$measurment]
    df$meas[is.na(df$meas)] <- 1
    # compute amount
    df$amount <- df$meas * df$amount
    

    数据

    df <- data.frame(Name = c("AC", "AC", "PT", "PT", "OR", "OR"),
                     measurment = c("H", "", "K", "M", "", "H"),
                     amount = c(1200, 54, 20000, 87000000, 75, 2200))
    

    【讨论】:

      【解决方案2】:

      您是否尝试过使用 pandas.read_csv?还是 csv 文件太不规则以至于无法使用 pandas 的read_csv 方法读取它们?

      您可以执行 for 循环来操作每个文件中的数据,然后将其附加到主文件 DataFrame

      例子:

      import pandas as pd
      
      PATH = '/home/data/' # Example path
      
      master_df = pd.DataFrame()
      for inputFile in fileList:
          csv_file = pd.read_csv(path + inputFile, sep=',')
          H_index = csv_file[csv_file.loc[:, 2] == 'H'].index
          csv_file.loc[H_index, 3] = csv_file.loc[H_index, 3] * 100
          master_df = master_df.append(csv_file)
      

      我已经跳过了KM 部分的操作。

      您可以通过执行类似的操作直接从master_df 绘图

      master_df.plot()
      

      【讨论】:

        【解决方案3】:

        您已经获得了要读取数据的代码 (read.csv),所以我认为您的主要困难在于操作本身是否正确?

        如果是这样,您可以继续使用大量 if 和 for 循环,但我认为还有更简单的方法。类似的东西:

        df <- read.csv("xxxx.csv", header=T,sep=",")
        df$meas <- df$measurement # Create a new column called 'meas' by copying column 'measurement'
        df$meas[df$meas == "H"] <- 100 # Replace H's with 100
        df$meas[df$meas == "K"] <- 1000
        df$meas[df$meas == "M"] <- 1000000
        df$value <- df$meas * df$amount
        

        【讨论】:

          猜你喜欢
          • 2021-04-25
          • 2016-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-29
          • 2023-03-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多