0

我是 R 的(非常)新用户,并试图在这里复制我的 MATLAB 代码(在这个阶段更喜欢 R 而不是 Octave)。

我有以下矩阵df

variable value
th   100
tw   100
gap  30

我希望能够根据第一列将变量分配给第二列中的值。所以基本上, th = 100, tw = 100, gap = 30.

我的最终目标是能够以以下方式操作数据:

difference <- th-gap

编辑:

>dput(df)
structure(list(s = structure(1:3, .Label = c("aa", "bb", "cc" ), class = "factor"),
n = c(2, 3, 5)), .Names = c("s", "n"), row.names = c(NA, -3L), class = "data.frame")
4

2 回答 2

0

你几乎可以肯定有一个data.frame与 a 完全不同的对象matrix。Amatrix是具有维度属性的原子向量,将其包装成 a matrix。由于它实际上只是一个原子向量,因此矩阵只能包含单一类型的数据,因此您不能将character数据与numeric数据混合。data.frame另一方面,A是一种列表,其中每个列表元素是相同长度的原子向量(长度给出行数,列表中的元素数是列数)。每个list元素可以保存不同类型的数据。

所以让我们假设你有一个data.frame......

#  Construct the data
df <- read.table( text = "variable value
th   100
tw   100
gap  30" , h = TRUE )

df
#  variable value
#1       th   100
#2       tw   100
#3      gap    30

#  Subset the data.frame to the values you want using the `[` operator
difference <- df[ df$variable == 'th' , 'value' ] - df[ df$variable == 'gap' , 'value' ]
#[1] 70

我们可以data.frame使用[运算符对 a 进行子集化。里面的第一个参数[,]是指行,第二个参数是指列。因此[ df$variable == 'th' , 'value' ] 在 rows 参数中返回一个逻辑向量,即TRUEwhenvariable == 'th'并为名为 的列返回满足此条件的所有行value

于 2013-08-28T13:25:34.217 回答
0

利用

Vectorize(assign, c("x", "value"))(as.character(M[,1]), M[,2], envir=globalenv())

M你的矩阵或数据框在哪里。请注意,as.character确保在分配之前将因子转换为字符串。

如果M是第二列中包含数字的字符矩阵,那么您可以使用as.numeric(M[,2])而不是M[,2].

但是,老实说,这不是最好的方法。使用assign通常不受欢迎,因为它不直观并且会导致代码可读性降低。

您可以创建一个列表:

L <- as.list(M[,2])
names(L) <- M[,1]

然后按名称访问您的数据,如L[["th"]].

于 2013-08-28T13:18:00.837 回答