在一行中返回特定值

时间:2019-10-17 15:50:46

标签: r

我将csv放入数据帧中的数据有1行,行中有50列。数据在电子表格中的排列方式如下:

“ FSEG- DFGS -THDG”,“ SGDG- SGRE -JJDF”,“ DIDC- DFGS -LEMS” ...

我如何只选择每个元素的中间部分(例如,第一个元素是“ DFGS ”,第二个元素是“ SGRE ”,等等),计算它们的中间部分事件并显示结果?

我尝试使用strsplit函数,但是无法使它适用于整个数据行。我在想可能是我需要的某种循环

2 个答案:

答案 0 :(得分:1)

您可以执行unlist(strsplit(x, '-'))[seq(2, length(x)*3, 3)](假设您的数据始终采用 A-B-C 的形式)。

# E.g.
fun <- function(x) unlist(strsplit(x, '-'))[seq(2, length(x)*3, 3)]
fun(c("FSEG-DFGS-THDG", "SGDG-SGRE-JJDF", "DIDC-DFGS-LEMS"))
# [1] "DFGS" "SGRE" "DFGS"

修改

# Data frame
df <- structure(list(a = "FSEG-DFGS-THDG", b = "SGDG-SGRE-JJDF", c = "DIDC-DFGS-LEMS"), 
                class = "data.frame", row.names = c(NA, -1L))
fun(t(df[1,]))
# [1] "DFGS" "SGRE" "DFGS"

答案 1 :(得分:0)

首先我们创建一个函数strng(),然后在apply()的每一列上dfstrsplit()用“-”分割字符串,strng()返回第二部分。

df = data.frame(a = "ab-bc-ca", b = "gn-bc-ca", c = "kj-ll-mn")
strng = function(x) {
  strsplit(x,"-")[[1]][2]
}

# table() outputs frequency of elements in the input
table(apply(df, MARGIN = 2, FUN = strng))

# output: bc ll 
          2  1