我有很多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”正在创建新的数据帧!
答案 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行相同)。