Select 列使用向量
Select columns using a vector
我正在尝试创建一个包含 2 列的新数据框:var1
和 var2
,其中每一列都是数据框 sampData
中特定列的行总和。
library(dplyr)
sampData <-
rnorm(260) %>%
matrix(ncol = 26) %>%
data.frame() %>%
setNames(LETTERS)
var1 <- c("A", "B", "C")
var2 <- c("D", "E", "F", "G")
我知道我可以使用 []
和 c()
select 列,像这样:
sampData[ ,c("A","B")]
但是当我尝试从我的向量中生成并使用该格式时:
d1_ <-paste(var1, collapse=",")
d2_ <-paste(var2, collapse=",")
sampData[ ,d1_]
我收到这个错误:
Error in `[.data.frame`(sampData, , d1_) : undefined columns selected
如果我尝试计算 rowSums
,我也会得到 - 这是我感兴趣的。
data.frame(var1 = rowSums(sampData[ , d1_])
, var2 = rowSums(sampData[ , d2_])
我想我已经弄清楚你在问什么,但如果我错了,请告诉我。
您正在尝试 prep
中与 l1
和 l2
中的值匹配的 select 列,并对各行求和,仅限于匹配的列每个。
提供可重现的数据总是更好,这里有一些针对这种情况的数据(使用 dplyr
构建):
sampData <-
rnorm(260) %>%
matrix(ncol = 26) %>%
data.frame() %>%
setNames(LETTERS)
var1 <- c("A", "B", "C")
var2 <- c("D", "E", "F", "G")
然后,您根本不需要连接列索引 - 只需直接使用变量(或列,在您的情况下)。在这里,我制作了 ID 的字母并将匹配这些字母。但是,如果您的 ID 是数字,它将匹配该索引(例如,3
将 return 第三列)。
data.frame(
var1sums = rowSums(sampData[, var1])
, var2sums = rowSums(sampData[, var2])
)
注意,cat
returns NULL
打印到屏幕后。如果您需要连接值,则需要使用 paste
(或类似的),但这 不会 对您在此处尝试执行的操作有效。
这个问题让我开始思考此类解决方案的灵活性,因此这里尝试使用 dplyr
和 tidyr
,这实际上产生了相同的结果。不同之处在于,这可能为变量 selection 甚至下游处理提供更大的灵活性。
sampData %>%
# add column for individual
mutate(ind = 1:nrow(.)) %>%
# convert data to long format
gather("Variable", "Value", -ind) %>%
# Set to group by the individual we added above
group_by(ind) %>%
# Calculate sums as desired
summarise(
var1sums = sum(Value[Variable %in% var1])
, var2sums = sum(Value[Variable %in% var2])
)
但是,如果您有任意数量(或者通常只是大量)变量集,您希望从中获取单个总和,那么真正的优势就会出现。您可以使用标准评估(而不是非标准评估)根据命名的向量列表自动生成列,而不是手动构建您可能感兴趣的每一列:
sampData %>%
mutate(ind = 1:nrow(.)) %>%
gather("Variable", "Value", -ind) %>%
group_by(ind) %>%
# Calculate one column for each vector in `varList`
summarise_(
.dots = lapply(varList, function(x){
paste0("sum(Value[Variable %in% c('"
, paste(x, collapse = "', '")
, "')])")
})
)
我正在尝试创建一个包含 2 列的新数据框:var1
和 var2
,其中每一列都是数据框 sampData
中特定列的行总和。
library(dplyr)
sampData <-
rnorm(260) %>%
matrix(ncol = 26) %>%
data.frame() %>%
setNames(LETTERS)
var1 <- c("A", "B", "C")
var2 <- c("D", "E", "F", "G")
我知道我可以使用 []
和 c()
select 列,像这样:
sampData[ ,c("A","B")]
但是当我尝试从我的向量中生成并使用该格式时:
d1_ <-paste(var1, collapse=",")
d2_ <-paste(var2, collapse=",")
sampData[ ,d1_]
我收到这个错误:
Error in `[.data.frame`(sampData, , d1_) : undefined columns selected
如果我尝试计算 rowSums
,我也会得到 - 这是我感兴趣的。
data.frame(var1 = rowSums(sampData[ , d1_])
, var2 = rowSums(sampData[ , d2_])
我想我已经弄清楚你在问什么,但如果我错了,请告诉我。
您正在尝试 prep
中与 l1
和 l2
中的值匹配的 select 列,并对各行求和,仅限于匹配的列每个。
提供可重现的数据总是更好,这里有一些针对这种情况的数据(使用 dplyr
构建):
sampData <-
rnorm(260) %>%
matrix(ncol = 26) %>%
data.frame() %>%
setNames(LETTERS)
var1 <- c("A", "B", "C")
var2 <- c("D", "E", "F", "G")
然后,您根本不需要连接列索引 - 只需直接使用变量(或列,在您的情况下)。在这里,我制作了 ID 的字母并将匹配这些字母。但是,如果您的 ID 是数字,它将匹配该索引(例如,3
将 return 第三列)。
data.frame(
var1sums = rowSums(sampData[, var1])
, var2sums = rowSums(sampData[, var2])
)
注意,cat
returns NULL
打印到屏幕后。如果您需要连接值,则需要使用 paste
(或类似的),但这 不会 对您在此处尝试执行的操作有效。
这个问题让我开始思考此类解决方案的灵活性,因此这里尝试使用 dplyr
和 tidyr
,这实际上产生了相同的结果。不同之处在于,这可能为变量 selection 甚至下游处理提供更大的灵活性。
sampData %>%
# add column for individual
mutate(ind = 1:nrow(.)) %>%
# convert data to long format
gather("Variable", "Value", -ind) %>%
# Set to group by the individual we added above
group_by(ind) %>%
# Calculate sums as desired
summarise(
var1sums = sum(Value[Variable %in% var1])
, var2sums = sum(Value[Variable %in% var2])
)
但是,如果您有任意数量(或者通常只是大量)变量集,您希望从中获取单个总和,那么真正的优势就会出现。您可以使用标准评估(而不是非标准评估)根据命名的向量列表自动生成列,而不是手动构建您可能感兴趣的每一列:
sampData %>%
mutate(ind = 1:nrow(.)) %>%
gather("Variable", "Value", -ind) %>%
group_by(ind) %>%
# Calculate one column for each vector in `varList`
summarise_(
.dots = lapply(varList, function(x){
paste0("sum(Value[Variable %in% c('"
, paste(x, collapse = "', '")
, "')])")
})
)