2012-09-12 156 views
20

我有这个示例代码来从现有数据框'my_data'创建一个新的数据框'new_data'。变量前面的美元符号

new_data = NULL 
n = 10 #this number correspond to the number of rows in my_data 
conditions = c("Bas_A", "Bas_T", "Oper_A", "Oper_T") # the vector characters correspond to the target column names in my_data 
for (cond in conditions){ 
    for (i in 1:n){ 
     new_data <- rbind(new_data, c(cond, my_data$cond[i])) 
    } 
} 

的问题是,my_data$cond(其中cond是一个变量,而不是列名)是不能接受的。

如何通过在美元符号后使用变量值来调用数据框的列?

+8

'$'并不真正用于编程式使用。它意味着交互式使用的便利。尝试使用'mydata [i,cond]'来代替。然而,看着你的代码,我认为你可能从'reshape'函数或'reshape2'软件包中获益...... – James

+0

请注意'my_data'是一个数据。frame'和'new_data'是一个'矩阵'。 – GSee

+3

参见'幸运(312)'。 –

回答

32

要访问的列,可使用:

my_data[ , cond] 

my_data[[cond]] 

i个行可以与被访问:

my_data[i, ] 

合并两组,以获得所希望的值:

my_data[i, cond] 

my_data[[cond]][i] 
+0

我们不能使用c $ column,其中'c'是一个矩阵?我得到了'c $ col1错误:$运算符对原子向量无效...... – Mahesha999

+0

@ Mahesha999您不能在矩阵中使用'$'。 –

3

我猜你需要get()

例如,
get(x,list),其中list是列表和x是变量(可以是一个字符串),其等于list$x

但在get(x,list),x可以是一个变量,而使用$,x不能是一个变量。

0

$适用于列而不是单个列对象。这是一种矢量化形式。代码

corrections$BookDate = as.Date(corrections$BookDate, format = "%m/%d/%Y") 

从字符串corrections表的BookDate列的内容转换为Date对象。它在一个操作中执行它,分配。

执行以下操作,它会解决您的问题:

new_data <- rbind(new_data, c(cond, my_data$cond)) 
0

你会经常要选择一整列,从数据帧,即一个特定的变量。例如,如果要选择变径的所有元素,例如,这两种方法都有效:

dataframe_name[,column_position] 
dataframe_name[,"column_name"] 

但是,有一个捷径。如果您的列有名称,则可以使用$符号:

dataframe_name$column_name