如何在R中读取多个csv文件时将数据添加为列?

时间:2017-03-05 12:33:01

标签: r dataframe

我有很多csv文件,我试图通过“data.table”读取。 csv文件的结构相同(3列)。

我的目标是在一个主数据框中读取所有csv文件!应将每个csv文件添加为不在行中的列。

例如:

我的主要DF结构应该是:

 Name     Name2        csv_file_name_1      csv_file_name_2 .......

现在,我想要做的是:读取新的csv文件(我只读取第3列)并添加到DF作为列。

例如,如果我有30个csv文件,我必须阅读所有这些文件并在主数据框中添加第3列作为新列。 (最终DF应该有30列)

我写了一些代码,我可以读取文件并获取文件名,一切运行良好。

files = list.files(path = path, pattern=".*csv")
for (i in 1:length(files)) assign(str_sub(files[i],11,-5), 
                              fread(files[i],colClasses = c("NULL", "NULL", NA)))

但是我如何在主DF中添加列? “assign”正在创建新的数据帧!

2 个答案:

答案 0 :(得分:1)

您可以使用cbind()来实现此目的,df <- read.csv(file="path/to/file1.csv", sep=",", header=TRUE) df_new <- read.csv(file="path/to/file2.csv", sep=",", header=TRUE) # this next is required only if you need to change the column names in each # subsequent file to something else names(df_new) <- c("Name2", "csv_file_name2", "other_column2") df <- cbind(df, df_new) 可以将您读取的每个新数据框绑定到现有数据框。我说可能因为如果你期望你读取的每个CSV文件具有相同的行数,这只会很有意义。应该清楚为什么这是一个要求。有了这个警告,这里有一个代码片段,它读入两个CSV文件,以提供您想要的输出类型:

package com.msp.googlemapsproject;

import android.content.Intent;
import android.os.Bundle;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

public class MainActivity extends android.support.v4.app.FragmentActivity
        implements GoogleMap.OnMarkerClickListener {

    static final LatLng MyHome = new LatLng(-29.759933, 30.801030);
    private GoogleMap googleMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        googleMap.setOnMarkerClickListener(this);

        try{

            if (googleMap == null) {

                googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();

            }

            googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);

            googleMap.setMyLocationEnabled(true);

            googleMap.setTrafficEnabled(true);

            googleMap.setIndoorEnabled(true);

            googleMap.setBuildingsEnabled(true);

            googleMap.getUiSettings().setZoomControlsEnabled(true);

            final Marker MyHome_display = googleMap.addMarker(new MarkerOptions().position(MyHome).title("Testing"));


        } catch (Exception e) {

            e.printStackTrace();
        }
    }

    @Override
    public boolean onMarkerClick(Marker marker) {
        if (marker.equals(MyHome))
        {
            Intent intent = new Intent(MainActivity.this, LastScreen.class);
            startActivity(intent);
        }
        return false;
    }
}

答案 1 :(得分:0)

你试过cbind吗?

理想情况下,每个CSV表都有一个唯一的标识符,允许您通过该标识符进行合并。

附注,使用cbind,注意确保每个data.frame中的行对应于相同的观察(即df1中的第一行与df2中的第1行相同)。

相关问题